diff --git a/NEWS.md b/NEWS.md index ecd63f1d7bd..e3f1171fd69 100644 --- a/NEWS.md +++ b/NEWS.md @@ -53,6 +53,10 @@ Summary of changes by function * Output columns standardized to ``(node, color)`` +* pgr_breadthFirstSearch + + * Standardizing output columns to ``(seq, depth, start_vid, pred, node, edge, cost, agg_cost)`` + * pgr_contraction .. Breaking change @@ -63,6 +67,10 @@ Summary of changes by function * Output columns standardized to ``(seq, path_seq, start_vid, end_vid, node, edge, cost, agg_cost)`` +* pgr_depthFirstSearch + + * Standardizing output columns to ``(seq, depth, start_vid, pred, node, edge, cost, agg_cost)`` + * pgr_dijkstra * Combinations signature promoted to official. @@ -282,6 +290,13 @@ Standardize output columns of functions with different output columns within ove * [#2927](https://github.com/pgRouting/pgrouting/issues/2927) pgr_sequentialVertexColoring +**Standardized to ``(seq, depth, start_vid, pred, node, edge, cost, agg_cost)``** + +* [#2931](https://github.com/pgRouting/pgrouting/issues/2931) + pgr_breadthFirstSearch +* [#2931](https://github.com/pgRouting/pgrouting/issues/2931) + pgr_depthFirstSearch + Removal of SQL deprecated signatures * [#2798](https://github.com/pgRouting/pgrouting/issues/2798): diff --git a/doc/_static/custom.css b/doc/_static/custom.css index 19da7b807b1..10b254f4ba0 100644 --- a/doc/_static/custom.css +++ b/doc/_static/custom.css @@ -36,6 +36,7 @@ div.note { div.warning { background-color: white; background-image: none; + border: 2px solid orange; } div.signatures { diff --git a/doc/conf.py.in b/doc/conf.py.in index 44a54626383..3487e449644 100644 --- a/doc/conf.py.in +++ b/doc/conf.py.in @@ -354,11 +354,6 @@ rst_epilog=""" .. |ksp-result| replace:: ``(seq, path_id, path_seq, node, edge, cost, agg_cost)`` .. |tsp-result| replace:: ``(seq, node, cost, agg_cost)`` .. |nksp-result| replace:: ``(seq, path_id, path_seq, start_vid, end_vid, node, edge, cost, agg_cost)`` -.. |old-generic-result| replace:: ``(seq, path_seq, [start_vid], [end_vid], node, edge, cost, agg_cost)`` -.. |result-1-1| replace:: ``(seq, path_seq, node, edge, cost, agg_cost)`` -.. |result-1-m| replace:: ``(seq, path_seq, end_vid, node, edge, cost, agg_cost)`` -.. |result-m-1| replace:: ``(seq, path_seq, start_vid, node, edge, cost, agg_cost)`` -.. |result-bfs| replace:: ``(seq, depth, start_vid, node, edge, cost, agg_cost)`` .. |result-spantree| replace:: ``(seq, depth, start_vid, pred, node, edge, cost, agg_cost)`` .. |result-mst| replace:: ``(edge, cost)`` .. |result-generic-no-seq| replace:: ``(seq, [start_vid], node, edge, cost, agg_cost)`` @@ -382,8 +377,6 @@ rst_epilog=""" .. |result-contract| replace:: ``(type, id, contracted_vertices, source, target, cost)`` .. |result-contraction-hierarchies| replace:: ``(type, id, contracted_vertices, source, target, cost, metric, vertex_order)`` .. |result-idom| replace:: ``(seq, vertex_id, idom)`` -.. |result-dij-dd| replace:: ``(seq, [from_v,] node, edge, cost, agg_cost)`` -.. |result-dij-dd-m| replace:: ``(seq, from_v, node, edge, cost, agg_cost)`` .. |result-linegf| replace:: ``(seq, source, target, cost, edge)`` .. |result-lineg| replace:: ``(seq, source, target, cost, reverse_cost)`` .. |result-flow| replace:: ``(seq, edge, start_vid, end_vid, flow, residual_capacity)`` diff --git a/doc/src/migration.rst b/doc/src/migration.rst index c6615447ef1..49d5c55fee2 100644 --- a/doc/src/migration.rst +++ b/doc/src/migration.rst @@ -10,6 +10,8 @@ | +.. titles: ==, ++, --, .., ^^ + Migration guide =============================================================================== @@ -28,6 +30,7 @@ Results can be different because of the changes. Migration to standardized columns +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +.. |old-generic-result| replace:: ``(seq, path_seq, [start_vid], [end_vid], node, edge, cost, agg_cost)`` .. |old-pid-result| replace:: ``(seq, path_seq, [start_pid], [end_pid], node, edge, cost, agg_cost)`` .. |pid-1-m| replace:: ``(seq, path_seq, end_pid, node, edge, cost, agg_cost)`` .. |pid-m-1| replace:: ``(seq, path_seq, start_pid, node, edge, cost, agg_cost)`` @@ -35,6 +38,12 @@ Migration to standardized columns .. |matrix-pid| replace:: ``(start_pid, end_pid, agg_cost)`` .. |old-edge-color| replace:: ``(edge_id, color_id)`` .. |old-node-color| replace:: ``(vertex_id, color_id)`` +.. |result-bfs| replace:: ``(seq, depth, start_vid, node, edge, cost, agg_cost)`` +.. |result-1-1| replace:: ``(seq, path_seq, node, edge, cost, agg_cost)`` +.. |result-1-m| replace:: ``(seq, path_seq, end_vid, node, edge, cost, agg_cost)`` +.. |result-m-1| replace:: ``(seq, path_seq, start_vid, node, edge, cost, agg_cost)`` +.. |result-dij-dd| replace:: ``(seq, [from_v,] node, edge, cost, agg_cost)`` +.. |result-dij-dd-m| replace:: ``(seq, from_v, node, edge, cost, agg_cost)`` There has been an effort to standardize function output columns names and types. @@ -87,8 +96,12 @@ types. - `Migration of single path functions`_ * - .. versionchanged:: 4.0.0 :doc:`pgr_bipartite` [3]_ - `Migration of output column name change`_ + * - .. versionchanged:: 4.0.0 :doc:`pgr_breadthFirstSearch` [3]_ + - `Migration of spanning tree functions`_ * - .. versionchanged:: 4.0.0 :doc:`pgr_dagShortestPath` [3]_ - `Migration of single path functions`_ + * - .. versionchanged:: 4.0.0 :doc:`pgr_depthFirstSearch` [3]_ + - `Migration of spanning tree functions`_ * - .. versionchanged:: 4.0.0 :doc:`pgr_edgeColoring` [3]_ - `Migration of output column name change`_ * - .. versionchanged:: 4.0.0 :doc:`pgr_edwardMoore` [3]_ @@ -301,7 +314,7 @@ To get the old version column names: rename ``start_vid`` to ``start_pid`` and Migration of single path functions ------------------------------------------------------------------------------- -THe standardized :ref:`pgRouting-concepts:Result columns for single path +The standardized :ref:`pgRouting-concepts:Result columns for single path functions` are |short-generic-result| The following functions need to be migrated when they are being used in an @@ -590,34 +603,47 @@ functions` are |result-spantree| * - Function - Version - From + * - ``pgr_drivingDistance`` + - v < 3.6 + - :ref:`from_result_dij_dd` + * - ``pgr_withPointsDD`` + - v < 3.6 + - :ref:`from_result_generic_no_seq` * - ``pgr_kruskalDD`` - v < 3.7 - - |result-bfs| + - :ref:`from_result_bfs` * - ``pgr_kruskalBFS`` - v < 3.7 - - |result-bfs| + - :ref:`from_result_bfs` * - ``pgr_kruskalDFS`` - v < 3.7 - - |result-bfs| + - :ref:`from_result_bfs` * - ``pgr_primDD`` - v < 3.7 - - |result-bfs| + - :ref:`from_result_bfs` * - ``pgr_primBFS`` - v < 3.7 - - |result-bfs| + - :ref:`from_result_bfs` * - ``pgr_primDFS`` - v < 3.7 - - |result-bfs| - * - ``pgr_drivingDistance`` - - v < 3.6 - - |result-dij-dd| - * - ``pgr_withPointsDD`` - - v < 3.6 - - |result-generic-no-seq| + - :ref:`from_result_bfs` + * - ``pgr_breadthFisrtSearch`` + - v < 4.0.0 + - :ref:`from_result_bfs` + * - ``pgr_depthFisrtSearch`` + - v < 4.0.0 + - :ref:`from_result_bfs` + to |result-spantree| -.. rubric:: Migration of |result-bfs| +.. contents:: Examples + :local: + +.. _from_result_bfs: + +Migration from |result-bfs|. +............................................................................... Signatures to be migrated: @@ -626,249 +652,243 @@ Signatures to be migrated: Before updating pgRouting enumerate the columns: |result-bfs| -.. rubric:: Migration of |result-dij-dd| - -Signatures to be migrated: +Single vertex example using ``pgr_kruskalDD`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -* Single vertex -* Multiple vertices +Migrating `this v3.6 +`__ example. -Migration depends on the signature. +.. literalinclude:: migration.queries + :start-after: --kruskalDD1 + :end-before: --kruskalDD2 -For single vertex: +Before updating pgRouting enumerate the columns: |result-bfs|. -* Before updating pgRouting, enumerate |result-1-1| columns +.. literalinclude:: migration.queries + :start-after: --kruskalDD2 + :end-before: --kruskalDD3 -For multiple vertices: +Multiple vertices example using ``pgr_kruskalDFS`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. warning:: Breaking change +Migrating `this v3.6 +`__ +example. - If using ``pgr_drivingDistance`` with multiple vertices: column names must be - changed after updating pgRouting. +.. literalinclude:: migration.queries + :start-after: --kruskalDD3 + :end-before: --kruskalDD4 -To get the old version column names |result-dij-dd-m| +Before updating pgRouting enumerate the columns: |result-bfs|. -* Enumerate |result-dij-dd-m| -* Rename ``start_vid`` to ``from_v``. +.. literalinclude:: migration.queries + :start-after: --kruskalDD4 + :end-before: --kruskalDD5 +.. _from_result_dij_dd: -.. rubric:: Migration of |result-generic-no-seq| +Migration from |result-dij-dd| +................................................................................. Signatures to be migrated: * Single vertex * Multiple vertices +Migration depends on the signature. -.. warning:: Breaking change - - If using ``pgr_withPointsDD``: function call must be changed after updating - pgRouting. +For single vertex: - ``pgr_withPointsDD``'s parameter ``driving_side`` changed from named optional - to unnamed positional parameter (position 5 in the function call) and its - validity differ for directed and undirected graphs. +* Before updating pgRouting, enumerate |result-1-1| columns -Migration depends on the signature. +For multiple vertices: -For ``pgr_withPointsDD`` Single vertex +.. warning:: Breaking change -To get the * Output columns were |result-1-1-no-seq| -* Does not have ``start_vid``, ``pred`` and ``depth`` result columns. -* ``driving_side`` parameter was named optional now it is compulsory unnamed. + Changes must be done after updating pgRouting. -For ``pgr_withPointsDD`` (Multiple vertices) +To get the old version column names |result-dij-dd-m|: -* Output columns were |result-m-1-no-seq| -* Does not have ``depth`` and ``pred`` result columns. -* ``driving_side`` parameter was named optional now it is compulsory unnamed. +* filter out the column ``pred`` and ``depth`` and +* rename ``start_vid`` to ``from_v``. -Validity of driving_side: +Single vertex example using ``pgr_drivingDistance`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -* On directed graph ``b`` could be used as **driving side** -* On undirected graph ``r``, ``l`` could be used as **driving side** +Migrating `this v3.5 +`__ +example. +.. literalinclude:: migration.queries + :start-after: --drivingdistance1 + :end-before: --drivingdistance2 -.. rubric:: After Migration +Before updating pgRouting, enumerate |result-1-1-no-seq| columns -* Be aware of the existence of the additional result Columns. +.. literalinclude:: migration.queries + :start-after: --drivingdistance2 + :end-before: --drivingdistance3 - * Output columns are |result-spantree| +Multiple vertices example using ``pgr_drivingDistance`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -* **driving side** parameter is unnamed compulsory, and valid values differ for - directed and undirected graphs. +Migrating `this v3.5 +`__ +example. - * Does not have a default value. - * In directed graph: valid values are [``r``, ``R``, ``l``, ``L``] - * In undirected graph: valid values are [``b``, ``B``] - * Using an invalid value throws an ``ERROR``. +.. literalinclude:: migration.queries + :start-after: --drivingdistance3 + :end-before: --drivingdistance4 -.. contents:: Examples - :local: +To get the old version column names |result-dij-dd-m|: filter out the column +``pred`` and ``depth`` and rename ``start_vid`` to ``from_v``. -Examples for single vertex -............................................................................... +.. literalinclude:: migration.queries + :start-after: --drivingdistance4 + :end-before: --drivingdistance5 -Using ``pgr_kruskalDD`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. _from_result_generic_no_seq: -Migrating `this v3.6 -`__ example. +Migration of |result-generic-no-seq| +................................................................................. -.. literalinclude:: migration.queries - :start-after: --kruskalDD1 - :end-before: --kruskalDD2 +Signatures to be migrated: -Before updating pgRouting enumerate the columns: |result-bfs|. +* Single vertex +* Multiple vertices -.. literalinclude:: migration.queries - :start-after: --kruskalDD2 - :end-before: --kruskalDD3 +.. warning:: Breaking change -Using ``pgr_primBFS`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Changes must be done after updating pgRouting. -Migrating `this v3.6 -`__ -example. +For single vertex: -.. literalinclude:: migration.queries - :start-after: --primDD1 - :end-before: --primDD2 +After updating pgRouting: -Before updating pgRouting enumerate the columns: |result-bfs|. +* Enumerate |result-1-1-no-seq| columns +* Use an unnamed valid value for **driving side** after the **distance** + parameter. -.. literalinclude:: migration.queries - :start-after: --primDD2 - :end-before: --primDD3 +For multiple vertices: -Using ``pgr_drivingDistance`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +After updating pgRouting: -Migrating `this v3.5 -`__ -example. +* Enumerate |result-m-1-no-seq| columns +* Use an unnamed valid value for **driving side** after the **distance** + parameter. -.. literalinclude:: migration.queries - :start-after: --drivingdistance1 - :end-before: --drivingdistance2 +.. note:: Validity of **driving side** parameter -Before updating pgRouting, enumerate |result-1-1-no-seq| columns + **driving side** parameter is unnamed compulsory, and valid values differ for + directed and undirected graphs. -.. literalinclude:: migration.queries - :start-after: --drivingdistance2 - :end-before: --drivingdistance3 + * Does not have a default value. + * In directed graph: valid values are [``r``, ``R``, ``l``, ``L``] + * In undirected graph: valid values are [``b``, ``B``] + * Using an invalid value throws an ``ERROR``. -Using ``pgr_withPointsDD`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Single vertex example using ``pgr_withPointsDD`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Migrating `this v3.5 `__ example. -.. warning:: Breaking change - - If using ``pgr_withPointsDD``: function call must be changed after updating - pgRouting. - - ``pgr_withPointsDD``'s parameter ``driving_side`` changed from named optional - to unnamed positional parameter (position 5 in the function call) and its - validity differ for directed and undirected graphs. - - .. literalinclude:: migration.queries :start-after: --withpointsdd4 :end-before: --withpointsdd5 -- Before updating pgRouting, enumerate |result-1-1-no-seq| columns -- After updating pgROuting use an unnamed valid value for **driving side** after - the **distance** parameter. +After updating pgRouting: + +* Enumerate |result-1-1-no-seq| columns +* Use an unnamed valid value for **driving side** after the **distance** + parameter. .. literalinclude:: migration.queries :start-after: --withpointsdd5 :end-before: --withpointsdd6 -Examples for multiple vertices -............................................................................... +Multiple vertices example using ``pgr_withPointsDD`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. rubric:: Using ``pgr_kruskalDFS`` - -Migrating `this v3.6 -`__ +Migrating `this v3.5 +`__ example. .. literalinclude:: migration.queries - :start-after: --kruskalDD3 - :end-before: --kruskalDD4 + :start-after: --withpointsdd6 + :end-before: --withpointsdd7 -Before updating pgRouting enumerate the columns: |result-bfs|. +After updating pgRouting: + +* Enumerate |result-m-1-no-seq| columns +* Use an unnamed valid value for **driving side** after the **distance** + parameter. .. literalinclude:: migration.queries - :start-after: --kruskalDD4 - :end-before: --kruskalDD5 + :start-after: --withpointsdd7 + :end-before: --withpointsdd8 -.. rubric:: Using ``pgr_primDD`` +Migration of output column name change +------------------------------------------------------------------------------- -Migrating `this v3.6 -`__ -example. +The standardized result columns for color functions are -.. literalinclude:: migration.queries - :start-after: --primDD3 - :end-before: --primDD4 +* |result_edge_color| +* |result_node_color| -Before updating pgRouting enumerate the columns: |result-bfs|. +.. warning:: Breaking change -.. literalinclude:: migration.queries - :start-after: --primDD4 - :end-before: --primDD5 + Changes must be done after updating pgRouting. -.. rubric:: Using ``pgr_drivingDistance`` +.. list-table:: + :header-rows: 1 -Migrating `this v3.5 -`__ -example. + * - Function + - Version + - From + * - ``pgr_edgeColoring`` + - v < 4.0.0 + - :ref:`from_old_edge_color` + * - ``pgr_bipartite`` + - v < 4.0.0 + - :ref:`from_old_node_color` + * - ``pgr_sequentialVertexColoring`` + - v < 4.0.0 + - :ref:`from_old_node_color` -.. literalinclude:: migration.queries - :start-after: --drivingdistance3 - :end-before: --drivingdistance4 +.. _from_old_edge_color: -.. warning:: Breaking change +Migration from |old-edge-color| +................................................................................. - If using ``pgr_drivingDistance`` with multiple vertices: column names must be - changed after updating pgRouting +Migration to: |result_edge_color| -To get the old version column names |result-dij-dd-m|: filter out the column -``pred`` and ``depth`` and rename ``start_vid`` to ``from_v``. +.. warning:: Breaking change + Changes must be done after updating pgRouting. -.. literalinclude:: migration.queries - :start-after: --drivingdistance4 - :end-before: --drivingdistance5 +After update: -Migration of output column name change -------------------------------------------------------------------------------- +* Rename ``edge_id`` to ``edge`` and ``color_id`` to ``color``. -.. rubric:: :doc:`pgr_edgeColoring` +.. TODO examples -From: |old-edge-color| -To: |result_edge_color| +.. _from_old_node_color: -Before update: +Migration from |old-node-color| +................................................................................. -* Rename ``edge_id`` to ``edge`` and ``color_id`` to ``color``. -* To get the old version column names: in the ``SELECT`` clause use ``edge AS - edge_id`` and ``color AS color_id`` +Migration to: |result_node_color| -.. rubric:: :doc:`pgr_bipartite` and :doc:`pgr_sequentialVertexColoring` +.. warning:: Breaking change -From: |old-node-color| -To: |result_node_color| + Changes must be done after updating pgRouting. -Before update: +After update: * Rename ``vertex_id`` to ``node`` and ``color_id`` to ``color``. -* To get the old version column names: in the ``SELECT`` clause use ``node AS - vertex_id`` and ``color AS color_id`` + +.. TODO examples Migration of deleted functions +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/doc/src/pgRouting-concepts.rst b/doc/src/pgRouting-concepts.rst index 480048c46e0..3b66eaa9057 100644 --- a/doc/src/pgRouting-concepts.rst +++ b/doc/src/pgRouting-concepts.rst @@ -1779,6 +1779,19 @@ Result columns for flow functions Result columns for spanning tree functions ............................................................................... +Used by: + +* :doc:`pgr_breadthFirstSearch` +* :doc:`pgr_depthFirstSearch` +* :doc:`pgr_drivingDistance` +* :doc:`pgr_kruskalBFS` +* :doc:`pgr_kruskalDD` +* :doc:`pgr_kruskalDFS` +* :doc:`pgr_primBFS` +* :doc:`pgr_primDD` +* :doc:`pgr_primDFS` +* :doc:`pgr_withPointsDD` + .. spantree-result-columns-start Returns set of |result-spantree| @@ -1905,59 +1918,9 @@ How to contribute Consult the `developer's documentation `__ -Others +See also ---------------------------------------------------------------------- -.. return_path_short_start - -Returns set of |old-generic-result| - -.. list-table:: - :width: 81 - :widths: 12 14 60 - :header-rows: 1 - - * - Column - - Type - - Description - * - ``seq`` - - ``INTEGER`` - - Sequential value starting from **1**. - * - ``path_seq`` - - ``INTEGER`` - - Relative position in the path. Has value **1** for the beginning of a - path. - * - ``start_vid`` - - ``BIGINT`` - - Identifier of the starting vertex. - Returned when multiple starting vetrices are in the query. - - * `Many to One`_ - * `Many to Many`_ - * - ``end_vid`` - - ``BIGINT`` - - Identifier of the ending vertex. - Returned when multiple ending vertices are in the query. - - * `One to Many`_ - * `Many to Many`_ - * - ``node`` - - ``BIGINT`` - - Identifier of the node in the path from ``start_vid`` to ``end_vid``. - * - ``edge`` - - ``BIGINT`` - - Identifier of the edge used to go from ``node`` to the next node in the - path sequence. **-1** for the last node of the path. - * - ``cost`` - - ``FLOAT`` - - Cost to traverse from ``node`` using ``edge`` to the next node in the - path sequence. - * - ``agg_cost`` - - ``FLOAT`` - - Aggregate cost from ``start_vid`` to ``node``. - -.. return_path_short_end - .. rubric:: Indices and tables * :ref:`genindex` diff --git a/doc/src/release_notes.rst b/doc/src/release_notes.rst index 481003e1632..f5e725d7c4a 100644 --- a/doc/src/release_notes.rst +++ b/doc/src/release_notes.rst @@ -104,6 +104,12 @@ Summary of changes by function :start-after: Version 4.0.0 :end-before: .. rubric +* pgr_breadthFirstSearch + + .. include:: pgr_breadthFirstSearch.rst + :start-after: Version 4.0.0 + :end-before: .. rubric + * pgr_contraction .. include:: pgr_contraction.rst @@ -116,6 +122,12 @@ Summary of changes by function :start-after: Version 4.0.0 :end-before: .. rubric +* pgr_depthFirstSearch + + .. include:: pgr_depthFirstSearch.rst + :start-after: Version 4.0.0 + :end-before: .. rubric + * pgr_dijkstra .. include:: pgr_dijkstra.rst @@ -318,6 +330,13 @@ Standardize output columns of functions with different output columns within ove * `#2927 `__ pgr_sequentialVertexColoring +.. rubric:: Standardized to |result-spantree| + +* `#2931 `__ + pgr_breadthFirstSearch +* `#2931 `__ + pgr_depthFirstSearch + Removal of SQL deprecated signatures ............................................................................... diff --git a/doc/traversal/pgr_breadthFirstSearch.rst b/doc/traversal/pgr_breadthFirstSearch.rst index d8638e6dd0b..35b90f7aecb 100644 --- a/doc/traversal/pgr_breadthFirstSearch.rst +++ b/doc/traversal/pgr_breadthFirstSearch.rst @@ -26,9 +26,13 @@ Search algorithm. .. rubric:: Availability -* Version 3.0.0 +.. rubric:: Version 4.0.0: - * New experimental function. +* Standardizing output columns to |result-spantree| + +.. rubric:: Version 3.0.0 + +* New experimental function. Description ------------------------------------------------------------------------------- @@ -57,7 +61,7 @@ Signatures | pgr_breadthFirstSearch(`Edges SQL`_, **root vids**, [**options**]) | **options:** ``[max_depth, directed]`` - | Returns set of |result-bfs| + | Returns set of |result-spantree| .. index:: single: breadthFirstSearch - Experimental ; Single vertex - Experimental on v3.0 @@ -71,7 +75,7 @@ Single vertex | pgr_breadthFirstSearch(`Edges SQL`_, **root vid**, [**options**]) | **options:** ``[max_depth, directed]`` - | Returns set of |result-bfs| + | Returns set of |result-spantree| :Example: From root vertex :math:`6` on a **directed** graph with edges in ascending order of ``id`` @@ -92,7 +96,7 @@ Multiple vertices | pgr_breadthFirstSearch(`Edges SQL`_, **root vids**, [**options**]) | **options:** ``[max_depth, directed]`` - | Returns set of |result-bfs| + | Returns set of |result-spantree| :Example: From root vertices :math:`\{12, 6\}` on an **undirected** graph with **depth** :math:`<= 2` and edges in ascending order of ``id`` diff --git a/doc/traversal/pgr_depthFirstSearch.rst b/doc/traversal/pgr_depthFirstSearch.rst index c9c8b351284..b71affc97b1 100644 --- a/doc/traversal/pgr_depthFirstSearch.rst +++ b/doc/traversal/pgr_depthFirstSearch.rst @@ -26,13 +26,17 @@ The graph can be directed or undirected. .. rubric:: Availability -* Version 3.3.0 +.. rubric:: Version 4.0.0: - * Function promoted to proposed. +* Standardizing output columns to |result-spantree| -* Version 3.2.0 +.. rubric:: Version 3.3.0 - * New experimental function. +* Function promoted to proposed. + +.. rubric:: Version 3.2.0 + +* New experimental function. Description ------------------------------------------------------------------------------- @@ -70,7 +74,7 @@ Signatures | pgr_depthFirstSearch(`Edges SQL`_, **root vids**, [**options**]) | **options:** ``[directed, max_depth]`` - | Returns set of |result-bfs| + | Returns set of |result-spantree| .. index:: single: depthFirstSearch - Proposed ; Single vertex - Proposed on v3.3 @@ -84,7 +88,7 @@ Single vertex | pgr_depthFirstSearch(`Edges SQL`_, **root vid**, [**options**]) | **options:** ``[directed, max_depth]`` - | Returns set of |result-bfs| + | Returns set of |result-spantree| :Example: From root vertex :math:`6` on a **directed** graph with edges in ascending order of ``id`` @@ -105,7 +109,7 @@ Multiple vertices | pgr_depthFirstSearch(`Edges SQL`_, **root vids**, [**options**]) | **options:** ``[directed, max_depth]`` - | Returns set of |result-bfs| + | Returns set of |result-spantree| :Example: From root vertices :math:`\{12, 6\}` on an **undirected** graph with **depth** :math:`<= 2` and edges in ascending order of ``id`` diff --git a/docqueries/traversal/breadthFirstSearch.result b/docqueries/traversal/breadthFirstSearch.result index f5bda2532d7..89e9085e8dd 100644 --- a/docqueries/traversal/breadthFirstSearch.result +++ b/docqueries/traversal/breadthFirstSearch.result @@ -7,21 +7,21 @@ SELECT * FROM pgr_breadthFirstSearch( 'SELECT id, source, target, cost, reverse_cost FROM edges ORDER BY id', 6); - seq | depth | start_vid | node | edge | cost | agg_cost ------+-------+-----------+------+------+------+---------- - 1 | 0 | 6 | 6 | -1 | 0 | 0 - 2 | 1 | 6 | 5 | 1 | 1 | 1 - 3 | 1 | 6 | 7 | 4 | 1 | 1 - 4 | 2 | 6 | 3 | 7 | 1 | 2 - 5 | 2 | 6 | 11 | 8 | 1 | 2 - 6 | 2 | 6 | 8 | 10 | 1 | 2 - 7 | 3 | 6 | 1 | 6 | 1 | 3 - 8 | 3 | 6 | 16 | 9 | 1 | 3 - 9 | 3 | 6 | 12 | 11 | 1 | 3 - 10 | 3 | 6 | 9 | 14 | 1 | 3 - 11 | 4 | 6 | 17 | 15 | 1 | 4 - 12 | 4 | 6 | 15 | 16 | 1 | 4 - 13 | 5 | 6 | 10 | 3 | 1 | 5 + seq | depth | start_vid | pred | node | edge | cost | agg_cost +-----+-------+-----------+------+------+------+------+---------- + 1 | 0 | 6 | 6 | 6 | -1 | 0 | 0 + 2 | 1 | 6 | 6 | 5 | 1 | 1 | 1 + 3 | 1 | 6 | 6 | 7 | 4 | 1 | 1 + 4 | 2 | 6 | 7 | 3 | 7 | 1 | 2 + 5 | 2 | 6 | 7 | 11 | 8 | 1 | 2 + 6 | 2 | 6 | 7 | 8 | 10 | 1 | 2 + 7 | 3 | 6 | 3 | 1 | 6 | 1 | 3 + 8 | 3 | 6 | 11 | 16 | 9 | 1 | 3 + 9 | 3 | 6 | 11 | 12 | 11 | 1 | 3 + 10 | 3 | 6 | 8 | 9 | 14 | 1 | 3 + 11 | 4 | 6 | 16 | 17 | 15 | 1 | 4 + 12 | 4 | 6 | 16 | 15 | 16 | 1 | 4 + 13 | 5 | 6 | 15 | 10 | 3 | 1 | 5 (13 rows) /* -- q2 */ @@ -29,24 +29,24 @@ SELECT * FROM pgr_breadthFirstSearch( 'SELECT id, source, target, cost, reverse_cost FROM edges ORDER BY id', ARRAY[12, 6], directed => false, max_depth => 2); - seq | depth | start_vid | node | edge | cost | agg_cost ------+-------+-----------+------+------+------+---------- - 1 | 0 | 6 | 6 | -1 | 0 | 0 - 2 | 1 | 6 | 5 | 1 | 1 | 1 - 3 | 1 | 6 | 10 | 2 | 1 | 1 - 4 | 1 | 6 | 7 | 4 | 1 | 1 - 5 | 2 | 6 | 15 | 3 | 1 | 2 - 6 | 2 | 6 | 11 | 5 | 1 | 2 - 7 | 2 | 6 | 3 | 7 | 1 | 2 - 8 | 2 | 6 | 8 | 10 | 1 | 2 - 9 | 0 | 12 | 12 | -1 | 0 | 0 - 10 | 1 | 12 | 11 | 11 | 1 | 1 - 11 | 1 | 12 | 8 | 12 | 1 | 1 - 12 | 1 | 12 | 17 | 13 | 1 | 1 - 13 | 2 | 12 | 10 | 5 | 1 | 2 - 14 | 2 | 12 | 7 | 8 | 1 | 2 - 15 | 2 | 12 | 16 | 9 | 1 | 2 - 16 | 2 | 12 | 9 | 14 | 1 | 2 + seq | depth | start_vid | pred | node | edge | cost | agg_cost +-----+-------+-----------+------+------+------+------+---------- + 1 | 0 | 6 | 6 | 6 | -1 | 0 | 0 + 2 | 1 | 6 | 6 | 5 | 1 | 1 | 1 + 3 | 1 | 6 | 6 | 10 | 2 | 1 | 1 + 4 | 1 | 6 | 6 | 7 | 4 | 1 | 1 + 5 | 2 | 6 | 10 | 15 | 3 | 1 | 2 + 6 | 2 | 6 | 10 | 11 | 5 | 1 | 2 + 7 | 2 | 6 | 7 | 3 | 7 | 1 | 2 + 8 | 2 | 6 | 7 | 8 | 10 | 1 | 2 + 9 | 0 | 12 | 12 | 12 | -1 | 0 | 0 + 10 | 1 | 12 | 12 | 11 | 11 | 1 | 1 + 11 | 1 | 12 | 12 | 8 | 12 | 1 | 1 + 12 | 1 | 12 | 12 | 17 | 13 | 1 | 1 + 13 | 2 | 12 | 11 | 10 | 5 | 1 | 2 + 14 | 2 | 12 | 11 | 7 | 8 | 1 | 2 + 15 | 2 | 12 | 11 | 16 | 9 | 1 | 2 + 16 | 2 | 12 | 8 | 9 | 14 | 1 | 2 (16 rows) /* -- q3 */ @@ -54,21 +54,21 @@ SELECT * FROM pgr_breadthFirstSearch( 'SELECT id, source, target, cost, reverse_cost FROM edges ORDER BY id DESC', 6); - seq | depth | start_vid | node | edge | cost | agg_cost ------+-------+-----------+------+------+------+---------- - 1 | 0 | 6 | 6 | -1 | 0 | 0 - 2 | 1 | 6 | 7 | 4 | 1 | 1 - 3 | 1 | 6 | 5 | 1 | 1 | 1 - 4 | 2 | 6 | 8 | 10 | 1 | 2 - 5 | 2 | 6 | 11 | 8 | 1 | 2 - 6 | 2 | 6 | 3 | 7 | 1 | 2 - 7 | 3 | 6 | 9 | 14 | 1 | 3 - 8 | 3 | 6 | 12 | 12 | 1 | 3 - 9 | 3 | 6 | 16 | 9 | 1 | 3 - 10 | 3 | 6 | 1 | 6 | 1 | 3 - 11 | 4 | 6 | 17 | 13 | 1 | 4 - 12 | 4 | 6 | 15 | 16 | 1 | 4 - 13 | 5 | 6 | 10 | 3 | 1 | 5 + seq | depth | start_vid | pred | node | edge | cost | agg_cost +-----+-------+-----------+------+------+------+------+---------- + 1 | 0 | 6 | 6 | 6 | -1 | 0 | 0 + 2 | 1 | 6 | 6 | 7 | 4 | 1 | 1 + 3 | 1 | 6 | 6 | 5 | 1 | 1 | 1 + 4 | 2 | 6 | 7 | 8 | 10 | 1 | 2 + 5 | 2 | 6 | 7 | 11 | 8 | 1 | 2 + 6 | 2 | 6 | 7 | 3 | 7 | 1 | 2 + 7 | 3 | 6 | 8 | 9 | 14 | 1 | 3 + 8 | 3 | 6 | 8 | 12 | 12 | 1 | 3 + 9 | 3 | 6 | 11 | 16 | 9 | 1 | 3 + 10 | 3 | 6 | 3 | 1 | 6 | 1 | 3 + 11 | 4 | 6 | 12 | 17 | 13 | 1 | 4 + 12 | 4 | 6 | 16 | 15 | 16 | 1 | 4 + 13 | 5 | 6 | 15 | 10 | 3 | 1 | 5 (13 rows) /* -- q4 */ diff --git a/docqueries/traversal/depthFirstSearch.result b/docqueries/traversal/depthFirstSearch.result index 86885ed7efe..66e45f05bc9 100644 --- a/docqueries/traversal/depthFirstSearch.result +++ b/docqueries/traversal/depthFirstSearch.result @@ -7,21 +7,21 @@ SELECT * FROM pgr_depthFirstSearch( 'SELECT id, source, target, cost, reverse_cost FROM edges ORDER BY id', 6); - seq | depth | start_vid | node | edge | cost | agg_cost ------+-------+-----------+------+------+------+---------- - 1 | 0 | 6 | 6 | -1 | 0 | 0 - 2 | 1 | 6 | 5 | 1 | 1 | 1 - 3 | 1 | 6 | 7 | 4 | 1 | 1 - 4 | 2 | 6 | 3 | 7 | 1 | 2 - 5 | 3 | 6 | 1 | 6 | 1 | 3 - 6 | 2 | 6 | 11 | 8 | 1 | 2 - 7 | 3 | 6 | 16 | 9 | 1 | 3 - 8 | 4 | 6 | 17 | 15 | 1 | 4 - 9 | 4 | 6 | 15 | 16 | 1 | 4 - 10 | 5 | 6 | 10 | 3 | 1 | 5 - 11 | 3 | 6 | 12 | 11 | 1 | 3 - 12 | 2 | 6 | 8 | 10 | 1 | 2 - 13 | 3 | 6 | 9 | 14 | 1 | 3 + seq | depth | start_vid | pred | node | edge | cost | agg_cost +-----+-------+-----------+------+------+------+------+---------- + 1 | 0 | 6 | 6 | 6 | -1 | 0 | 0 + 2 | 1 | 6 | 6 | 5 | 1 | 1 | 1 + 3 | 1 | 6 | 6 | 7 | 4 | 1 | 1 + 4 | 2 | 6 | 7 | 3 | 7 | 1 | 2 + 5 | 3 | 6 | 3 | 1 | 6 | 1 | 3 + 6 | 2 | 6 | 7 | 11 | 8 | 1 | 2 + 7 | 3 | 6 | 11 | 16 | 9 | 1 | 3 + 8 | 4 | 6 | 16 | 17 | 15 | 1 | 4 + 9 | 4 | 6 | 16 | 15 | 16 | 1 | 4 + 10 | 5 | 6 | 15 | 10 | 3 | 1 | 5 + 11 | 3 | 6 | 11 | 12 | 11 | 1 | 3 + 12 | 2 | 6 | 7 | 8 | 10 | 1 | 2 + 13 | 3 | 6 | 8 | 9 | 14 | 1 | 3 (13 rows) /* -- q2 */ @@ -29,24 +29,24 @@ SELECT * FROM pgr_depthFirstSearch( 'SELECT id, source, target, cost, reverse_cost FROM edges ORDER BY id', ARRAY[12, 6], directed => false, max_depth => 2); - seq | depth | start_vid | node | edge | cost | agg_cost ------+-------+-----------+------+------+------+---------- - 1 | 0 | 6 | 6 | -1 | 0 | 0 - 2 | 1 | 6 | 5 | 1 | 1 | 1 - 3 | 1 | 6 | 10 | 2 | 1 | 1 - 4 | 2 | 6 | 15 | 3 | 1 | 2 - 5 | 2 | 6 | 11 | 5 | 1 | 2 - 6 | 1 | 6 | 7 | 4 | 1 | 1 - 7 | 2 | 6 | 3 | 7 | 1 | 2 - 8 | 2 | 6 | 8 | 10 | 1 | 2 - 9 | 0 | 12 | 12 | -1 | 0 | 0 - 10 | 1 | 12 | 11 | 11 | 1 | 1 - 11 | 2 | 12 | 10 | 5 | 1 | 2 - 12 | 2 | 12 | 7 | 8 | 1 | 2 - 13 | 2 | 12 | 16 | 9 | 1 | 2 - 14 | 1 | 12 | 8 | 12 | 1 | 1 - 15 | 2 | 12 | 9 | 14 | 1 | 2 - 16 | 1 | 12 | 17 | 13 | 1 | 1 + seq | depth | start_vid | pred | node | edge | cost | agg_cost +-----+-------+-----------+------+------+------+------+---------- + 1 | 0 | 6 | 6 | 6 | -1 | 0 | 0 + 2 | 1 | 6 | 6 | 5 | 1 | 1 | 1 + 3 | 1 | 6 | 6 | 10 | 2 | 1 | 1 + 4 | 2 | 6 | 10 | 15 | 3 | 1 | 2 + 5 | 2 | 6 | 10 | 11 | 5 | 1 | 2 + 6 | 1 | 6 | 6 | 7 | 4 | 1 | 1 + 7 | 2 | 6 | 7 | 3 | 7 | 1 | 2 + 8 | 2 | 6 | 7 | 8 | 10 | 1 | 2 + 9 | 0 | 12 | 12 | 12 | -1 | 0 | 0 + 10 | 1 | 12 | 12 | 11 | 11 | 1 | 1 + 11 | 2 | 12 | 11 | 10 | 5 | 1 | 2 + 12 | 2 | 12 | 11 | 7 | 8 | 1 | 2 + 13 | 2 | 12 | 11 | 16 | 9 | 1 | 2 + 14 | 1 | 12 | 12 | 8 | 12 | 1 | 1 + 15 | 2 | 12 | 8 | 9 | 14 | 1 | 2 + 16 | 1 | 12 | 12 | 17 | 13 | 1 | 1 (16 rows) /* -- q3 */ @@ -54,21 +54,21 @@ SELECT * FROM pgr_depthFirstSearch( 'SELECT id, source, target, cost, reverse_cost FROM edges ORDER BY id DESC', 6); - seq | depth | start_vid | node | edge | cost | agg_cost ------+-------+-----------+------+------+------+---------- - 1 | 0 | 6 | 6 | -1 | 0 | 0 - 2 | 1 | 6 | 7 | 4 | 1 | 1 - 3 | 2 | 6 | 8 | 10 | 1 | 2 - 4 | 3 | 6 | 9 | 14 | 1 | 3 - 5 | 3 | 6 | 12 | 12 | 1 | 3 - 6 | 4 | 6 | 17 | 13 | 1 | 4 - 7 | 5 | 6 | 16 | 15 | 1 | 5 - 8 | 6 | 6 | 15 | 16 | 1 | 6 - 9 | 7 | 6 | 10 | 3 | 1 | 7 - 10 | 8 | 6 | 11 | 5 | 1 | 8 - 11 | 2 | 6 | 3 | 7 | 1 | 2 - 12 | 3 | 6 | 1 | 6 | 1 | 3 - 13 | 1 | 6 | 5 | 1 | 1 | 1 + seq | depth | start_vid | pred | node | edge | cost | agg_cost +-----+-------+-----------+------+------+------+------+---------- + 1 | 0 | 6 | 6 | 6 | -1 | 0 | 0 + 2 | 1 | 6 | 6 | 7 | 4 | 1 | 1 + 3 | 2 | 6 | 7 | 8 | 10 | 1 | 2 + 4 | 3 | 6 | 8 | 9 | 14 | 1 | 3 + 5 | 3 | 6 | 8 | 12 | 12 | 1 | 3 + 6 | 4 | 6 | 12 | 17 | 13 | 1 | 4 + 7 | 5 | 6 | 17 | 16 | 15 | 1 | 5 + 8 | 6 | 6 | 16 | 15 | 16 | 1 | 6 + 9 | 7 | 6 | 15 | 10 | 3 | 1 | 7 + 10 | 8 | 6 | 10 | 11 | 5 | 1 | 8 + 11 | 2 | 6 | 7 | 3 | 7 | 1 | 2 + 12 | 3 | 6 | 3 | 1 | 6 | 1 | 3 + 13 | 1 | 6 | 6 | 5 | 1 | 1 | 1 (13 rows) /* -- q4 */ diff --git a/include/traversal/depthFirstSearch.hpp b/include/traversal/depthFirstSearch.hpp index 76327df136e..eb560c87d11 100644 --- a/include/traversal/depthFirstSearch.hpp +++ b/include/traversal/depthFirstSearch.hpp @@ -199,8 +199,7 @@ class Pgr_depthFirstSearch { results.push_back({ root, depth[v], - /* TODO(cvvc) get predecessor */ - 0, + graph[u].id, graph[v].id, graph[edge].id, graph[edge].cost, diff --git a/pgtap/traversal/breadthFirstSearch/edge_cases.pg b/pgtap/traversal/breadthFirstSearch/edge_cases.pg index 6add18c2528..b6a3023e750 100644 --- a/pgtap/traversal/breadthFirstSearch/edge_cases.pg +++ b/pgtap/traversal/breadthFirstSearch/edge_cases.pg @@ -22,127 +22,139 @@ BEGIN; UPDATE edges SET cost = sign(cost), reverse_cost = sign(reverse_cost); SELECT plan(29); --- 0 edges tests - -SELECT is_empty(' SELECT id, source, target, cost > 0, reverse_cost > 0 from edges where id>18 ','1'); - --- directed graph -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '', 5)', '2'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '',array[5])','3'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '',array[2,5])', '4'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '', 5, 2)', '5'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '',array[5], 2)','6'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '',array[2,5], 2)', '7'); - --- undirected graph -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '', 5, directed := false)', '8'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '',array[5], directed := false)','9'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '',array[2,5], directed := false)', '10'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '', 5, 2, directed := false)', '11'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '',array[5], 2, directed := false)','12'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '',array[2,5], 2, directed := false)', '13'); - - --- vertex not present in graph tests - --- directed graph -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'', -10)', '14'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'',array[-10])','15'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'',array[20,-10])', '16'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'', -10, 2)', '17'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'',array[-10], 2)','18'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'',array[20,-10], 2)', '19'); - --- undirected graph -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'', -10, directed := false)', '20'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'',array[-10], directed := false)','21'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'',array[20,-10], directed := false)', '22'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'', -10, 2, directed := false)', '23'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'',array[-10], 2, directed := false)','24'); -SELECT is_empty(' -SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'',array[20,-10], 2, directed := false)', '25'); - --- negative depth tests - -PREPARE breadthFirstSearch26 AS -SELECT * -FROM pgr_breadthFirstSearch( +CREATE OR REPLACE FUNCTION types_check() +RETURNS SETOF TEXT AS +$BODY$ +DECLARE code TEXT := 'P0001'; +BEGIN + + IF min_version('4.0.0') THEN + code := 'XX000'; + END IF; + + -- 0 edges tests + + RETURN QUERY SELECT is_empty(' SELECT id, source, target, cost > 0, reverse_cost > 0 from edges where id>18 ','1'); + + -- directed graph + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '', 5)', '2'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '',array[5])','3'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '',array[2,5])', '4'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '', 5, max_depth => 2)', '5'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '',array[5], max_depth => 2)','6'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '',array[2,5], max_depth => 2)', '7'); + + -- undirected graph + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '', 5, directed := false)', '8'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '',array[5], directed := false)','9'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '',array[2,5], directed := false)', '10'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '', 5, max_depth => 2, directed := false)', '11'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '',array[5], max_depth => 2, directed := false)','12'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges where id>18 '',array[2,5], max_depth => 2, directed := false)', '13'); + + + -- vertex not present in graph tests + + -- directed graph + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'', -10)', '14'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'',array[-10])','15'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'',array[20,-10])', '16'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'', -10, max_depth => 2)', '17'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'',array[-10], max_depth => 2)','18'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'',array[20,-10], max_depth => 2)', '19'); + + -- undirected graph + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'', -10, directed := false)', '20'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'',array[-10], directed := false)','21'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'',array[20,-10], directed := false)', '22'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'', -10, max_depth => 2, directed := false)', '23'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'',array[-10], max_depth => 2, directed := false)','24'); + RETURN QUERY SELECT is_empty(' + SELECT * from pgr_breadthFirstSearch(''SELECT id, source, target, cost, reverse_cost from edges'',array[20,-10], max_depth => 2, directed := false)', '25'); + + -- negative depth tests + + PREPARE breadthFirstSearch26 AS + SELECT * + FROM pgr_breadthFirstSearch( 'SELECT id, source, target, cost, reverse_cost FROM edges', - 4, -3 -); + 4, max_depth => -3 + ); -SELECT throws_ok('breadthFirstSearch26', - 'P0001', + RETURN QUERY SELECT throws_ok('breadthFirstSearch26', + code, 'Negative value found on ''max_depth''', '26: Negative max_depth throws'); -PREPARE breadthFirstSearch27 AS -SELECT * -FROM pgr_breadthFirstSearch( + PREPARE breadthFirstSearch27 AS + SELECT * + FROM pgr_breadthFirstSearch( 'SELECT id, source, target, cost, reverse_cost FROM edges', - ARRAY[4, 10], -3 -); + ARRAY[4, 10], max_depth => -3 + ); -SELECT throws_ok('breadthFirstSearch27', - 'P0001', + RETURN QUERY SELECT throws_ok('breadthFirstSearch27', + code, 'Negative value found on ''max_depth''', '27: Negative max_depth throws'); -PREPARE breadthFirstSearch28 AS -SELECT * -FROM pgr_breadthFirstSearch( + PREPARE breadthFirstSearch28 AS + SELECT * + FROM pgr_breadthFirstSearch( 'SELECT id, source, target, cost, reverse_cost FROM edges', - 4, -3, directed := false -); + 4, max_depth => -3, directed => false + ); -SELECT throws_ok('breadthFirstSearch28', - 'P0001', + RETURN QUERY SELECT throws_ok('breadthFirstSearch28', + code, 'Negative value found on ''max_depth''', '28: Negative max_depth throws'); - - -PREPARE breadthFirstSearch29 AS -SELECT * -FROM pgr_breadthFirstSearch( + PREPARE breadthFirstSearch29 AS + SELECT * + FROM pgr_breadthFirstSearch( 'SELECT id, source, target, cost, reverse_cost FROM edges', - ARRAY[4, 10], -3, directed := false -); + ARRAY[4, 10], max_depth => -3, directed => false + ); -SELECT throws_ok('breadthFirstSearch29', - 'P0001', + RETURN QUERY SELECT throws_ok('breadthFirstSearch29', + code, 'Negative value found on ''max_depth''', '29: Negative max_depth throws'); +END; +$BODY$ +LANGUAGE plpgsql; +SELECT types_check(); SELECT * FROM finish(); ROLLBACK; diff --git a/pgtap/traversal/breadthFirstSearch/inner_query.pg b/pgtap/traversal/breadthFirstSearch/inner_query.pg index ff22175f6d9..f527f893602 100644 --- a/pgtap/traversal/breadthFirstSearch/inner_query.pg +++ b/pgtap/traversal/breadthFirstSearch/inner_query.pg @@ -20,12 +20,28 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. BEGIN; UPDATE edges SET cost = sign(cost), reverse_cost = sign(reverse_cost); -SELECT plan(108); +SELECT CASE WHEN min_version('4.0.0') THEN plan(108) ELSE plan(1) END; --- SINGLE VERTEX -SELECT style_dijkstra('pgr_breadthFirstSearch(', ', 2)'); --- MULTIPLE VERTEX -SELECT style_dijkstra('pgr_breadthFirstSearch(', ', ARRAY[2,3])'); +CREATE OR REPLACE FUNCTION inner_query() +RETURNS SETOF TEXT AS +$BODY$ +BEGIN + IF NOT min_version('4.0.0') THEN + RETURN QUERY + SELECT skip(1, 'pgr_breadthFirstSearch: testing only signatures standardaized in v4.0.0.'); + RETURN; + END IF; + + -- SINGLE VERTEX + RETURN QUERY SELECT style_dijkstra('pgr_breadthFirstSearch(', ', 2)'); + -- MULTIPLE VERTEX + RETURN QUERY SELECT style_dijkstra('pgr_breadthFirstSearch(', ', ARRAY[2,3])'); + +END; +$BODY$ +LANGUAGE plpgsql; + +SELECT inner_query(); SELECT finish(); ROLLBACK; diff --git a/pgtap/traversal/breadthFirstSearch/no_crash_test.pg b/pgtap/traversal/breadthFirstSearch/no_crash_test.pg index 9ae6eae03ff..182e4bc1198 100644 --- a/pgtap/traversal/breadthFirstSearch/no_crash_test.pg +++ b/pgtap/traversal/breadthFirstSearch/no_crash_test.pg @@ -20,7 +20,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. BEGIN; UPDATE edges SET cost = sign(cost), reverse_cost = sign(reverse_cost); -SELECT plan(86); +SELECT CASE WHEN min_version('4.0.0') THEN plan(98) ELSE plan(3) END; PREPARE edges AS SELECT id, source, target, cost, reverse_cost FROM edges; @@ -40,6 +40,12 @@ DECLARE params TEXT[]; subs TEXT[]; BEGIN + IF NOT min_version('4.0.0') THEN + RETURN QUERY + SELECT skip(1, 'pgr_breadthFirstSearch: testing only signatures standardaized in v4.0.0.'); + RETURN; + END IF; + -- breadthFirstSearch params = ARRAY[ '$$SELECT id, source, target, cost, reverse_cost FROM edges$$', @@ -62,11 +68,13 @@ BEGIN params = ARRAY[ '$$SELECT id, source, target, cost, reverse_cost FROM edges$$', '5', + 'true', '3' ]::TEXT[]; subs = ARRAY[ 'NULL', '(SELECT id FROM vertices WHERE id IN (-1))', + 'NULL::BOOLEAN', 'NULL::INTEGER' ]::TEXT[]; @@ -100,11 +108,13 @@ BEGIN params = ARRAY[ '$$SELECT id, source, target, cost, reverse_cost FROM edges$$', 'ARRAY[5,3]', + 'true', '3' ]::TEXT[]; subs = ARRAY[ 'NULL', '(SELECT array_agg(id) FROM vertices WHERE id IN (-1))', + 'NULL::BOOLEAN', 'NULL::INTEGER' ]::TEXT[]; diff --git a/pgtap/traversal/breadthFirstSearch/types_check.pg b/pgtap/traversal/breadthFirstSearch/types_check.pg index 7d06c8dfabf..073742a2ce5 100644 --- a/pgtap/traversal/breadthFirstSearch/types_check.pg +++ b/pgtap/traversal/breadthFirstSearch/types_check.pg @@ -19,30 +19,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ********************************************************************PGR-GNU*/ BEGIN; -SELECT plan(7); +SELECT CASE WHEN min_version('4.0.0') THEN plan(7) ELSE plan(6) END; +SELECT traversal_types_check('pgr_breadthfirstsearch', standard_v => '4.0.0'); -SELECT has_function('pgr_breadthfirstsearch'); - -SELECT has_function('pgr_breadthfirstsearch', ARRAY['text','bigint','bigint','boolean']); -SELECT has_function('pgr_breadthfirstsearch', ARRAY['text','anyarray','bigint','boolean']); - -SELECT function_returns('pgr_breadthfirstsearch', ARRAY['text','bigint','bigint','boolean'], 'setof record'); -SELECT function_returns('pgr_breadthfirstsearch', ARRAY['text','anyarray','bigint','boolean'], 'setof record'); - -SELECT function_args_eq('pgr_breadthfirstsearch', - $$VALUES - ('{"","","max_depth","directed","seq","depth","start_vid","node","edge","cost","agg_cost"}'::TEXT[]), - ('{"","","max_depth","directed","seq","depth","start_vid","node","edge","cost","agg_cost"}'::TEXT[]) - $$ -); - -SELECT function_types_eq('pgr_breadthfirstsearch', - $$VALUES - ('{text,int8,int8,bool,int8,int8,int8,int8,int8,float8,float8}'::TEXT[]), - ('{text,anyarray,int8,bool,int8,int8,int8,int8,int8,float8,float8}'::TEXT[]) - $$ -); - -SELECT * FROM finish(); +SELECT finish(); ROLLBACK; diff --git a/pgtap/traversal/depthFirstSearch/edge_cases/copmare_BFS.pg b/pgtap/traversal/depthFirstSearch/edge_cases/copmare_BFS.pg index c5f6864a7c6..4152bd9e89d 100644 --- a/pgtap/traversal/depthFirstSearch/edge_cases/copmare_BFS.pg +++ b/pgtap/traversal/depthFirstSearch/edge_cases/copmare_BFS.pg @@ -21,297 +21,298 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. BEGIN; UPDATE edges SET cost = sign(cost), reverse_cost = sign(reverse_cost); -SELECT CASE WHEN min_version('3.2.0') THEN plan (16) ELSE plan(1) END; +SELECT CASE WHEN min_version('3.2.0') THEN plan (17) ELSE plan(1) END; CREATE OR REPLACE FUNCTION edge_cases() RETURNS SETOF TEXT AS $BODY$ BEGIN -IF NOT min_version('3.2.0') THEN - RETURN QUERY - SELECT skip(1, 'Function is new on 3.2.0'); - RETURN; -END IF; - + IF NOT min_version('3.2.0') THEN + RETURN QUERY + SELECT skip(1, 'pgr_depthFirstSearch: Function is new on 3.2.0'); + RETURN; + END IF; -PREPARE sample_data AS -SELECT id, source, target, cost, reverse_cost -FROM edges; + PREPARE sample_data AS + SELECT id, source, target, cost, reverse_cost + FROM edges; --- max_depth 1 cases (directed) + -- max_depth 1 cases (directed) -PREPARE depthFirstSearch1 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_depthFirstSearch( + PREPARE depthFirstSearch1 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_depthFirstSearch( 'sample_data', 1, max_depth => 1 -); + ); + + RETURN QUERY SELECT lives_ok('depthFirstSearch1'); -PREPARE depthFirstSearch2 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_depthFirstSearch( + PREPARE depthFirstSearch2 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_depthFirstSearch( 'sample_data', 2, max_depth => 1 -); + ); -PREPARE depthFirstSearch3 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_depthFirstSearch( + PREPARE depthFirstSearch3 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_depthFirstSearch( 'sample_data', 5, max_depth => 1 -); + ); -PREPARE breadthFirstSearch1 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_breadthFirstSearch( + PREPARE breadthFirstSearch1 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_breadthFirstSearch( 'sample_data', 1, max_depth => 1 -); + ); -PREPARE breadthFirstSearch2 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_breadthFirstSearch( + PREPARE breadthFirstSearch2 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_breadthFirstSearch( 'sample_data', 2, max_depth => 1 -); + ); -PREPARE breadthFirstSearch3 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_breadthFirstSearch( + PREPARE breadthFirstSearch3 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_breadthFirstSearch( 'sample_data', 5, max_depth => 1 -); + ); -RETURN QUERY -SELECT set_eq('depthFirstSearch1', 'breadthFirstSearch1', '1: max_depth => 1 cases (directed)'); -RETURN QUERY -SELECT set_eq('depthFirstSearch2', 'breadthFirstSearch2', '2: max_depth => 1 cases (directed)'); -RETURN QUERY -SELECT set_eq('depthFirstSearch3', 'breadthFirstSearch3', '3: max_depth => 1 cases (directed)'); + RETURN QUERY + SELECT set_eq('depthFirstSearch1', 'breadthFirstSearch1', '1: max_depth => 1 cases (directed)'); + RETURN QUERY + SELECT set_eq('depthFirstSearch2', 'breadthFirstSearch2', '2: max_depth => 1 cases (directed)'); + RETURN QUERY + SELECT set_eq('depthFirstSearch3', 'breadthFirstSearch3', '3: max_depth => 1 cases (directed)'); --- max_depth 1 cases (undirected) + -- max_depth 1 cases (undirected) -PREPARE depthFirstSearch4 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_depthFirstSearch( + PREPARE depthFirstSearch4 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_depthFirstSearch( 'sample_data', 1, directed => false, max_depth => 1 -); + ); -PREPARE depthFirstSearch5 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_depthFirstSearch( + PREPARE depthFirstSearch5 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_depthFirstSearch( 'sample_data', 2, directed => false, max_depth => 1 -); + ); -PREPARE depthFirstSearch6 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_depthFirstSearch( + PREPARE depthFirstSearch6 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_depthFirstSearch( 'sample_data', 5, directed => false, max_depth => 1 -); + ); -PREPARE breadthFirstSearch4 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_breadthFirstSearch( + PREPARE breadthFirstSearch4 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_breadthFirstSearch( 'sample_data', 1, directed => false, max_depth => 1 -); + ); -PREPARE breadthFirstSearch5 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_breadthFirstSearch( + PREPARE breadthFirstSearch5 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_breadthFirstSearch( 'sample_data', 2, directed => false, max_depth => 1 -); + ); -PREPARE breadthFirstSearch6 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_breadthFirstSearch( + PREPARE breadthFirstSearch6 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_breadthFirstSearch( 'sample_data', 5, directed => false, max_depth => 1 -); + ); -RETURN QUERY -SELECT set_eq('depthFirstSearch4', 'breadthFirstSearch4', '4: max_depth => 1 cases (undirected)'); -RETURN QUERY -SELECT set_eq('depthFirstSearch5', 'breadthFirstSearch5', '5: max_depth => 1 cases (undirected)'); -RETURN QUERY -SELECT set_eq('depthFirstSearch6', 'breadthFirstSearch6', '6: max_depth => 1 cases (undirected)'); + RETURN QUERY + SELECT set_eq('depthFirstSearch4', 'breadthFirstSearch4', '4: max_depth => 1 cases (undirected)'); + RETURN QUERY + SELECT set_eq('depthFirstSearch5', 'breadthFirstSearch5', '5: max_depth => 1 cases (undirected)'); + RETURN QUERY + SELECT set_eq('depthFirstSearch6', 'breadthFirstSearch6', '6: max_depth => 1 cases (undirected)'); --- max_depth 2 cases (directed) + -- max_depth 2 cases (directed) -PREPARE depthFirstSearch7 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_depthFirstSearch( + PREPARE depthFirstSearch7 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_depthFirstSearch( 'sample_data', 1, max_depth => 2 -); + ); -PREPARE depthFirstSearch8 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_depthFirstSearch( + PREPARE depthFirstSearch8 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_depthFirstSearch( 'sample_data', 2, max_depth => 2 -); + ); -PREPARE depthFirstSearch9 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_depthFirstSearch( + PREPARE depthFirstSearch9 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_depthFirstSearch( 'sample_data', 5, max_depth => 2 -); + ); -PREPARE breadthFirstSearch7 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_breadthFirstSearch( + PREPARE breadthFirstSearch7 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_breadthFirstSearch( 'sample_data', 1, max_depth => 2 -); + ); -PREPARE breadthFirstSearch8 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_breadthFirstSearch( + PREPARE breadthFirstSearch8 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_breadthFirstSearch( 'sample_data', 2, max_depth => 2 -); + ); -PREPARE breadthFirstSearch9 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_breadthFirstSearch( + PREPARE breadthFirstSearch9 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_breadthFirstSearch( 'sample_data', 5, max_depth => 2 -); + ); -RETURN QUERY -SELECT set_eq('depthFirstSearch7', 'breadthFirstSearch7', '7: max_depth => 2 cases (directed)'); -RETURN QUERY -SELECT set_eq('depthFirstSearch8', 'breadthFirstSearch8', '8: max_depth => 2 cases (directed)'); -RETURN QUERY -SELECT set_eq('depthFirstSearch9', 'breadthFirstSearch9', '9: max_depth => 2 cases (directed)'); + RETURN QUERY + SELECT set_eq('depthFirstSearch7', 'breadthFirstSearch7', '7: max_depth => 2 cases (directed)'); + RETURN QUERY + SELECT set_eq('depthFirstSearch8', 'breadthFirstSearch8', '8: max_depth => 2 cases (directed)'); + RETURN QUERY + SELECT set_eq('depthFirstSearch9', 'breadthFirstSearch9', '9: max_depth => 2 cases (directed)'); --- max_depth 2 cases (undirected) + -- max_depth 2 cases (undirected) -PREPARE depthFirstSearch10 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_depthFirstSearch( + PREPARE depthFirstSearch10 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_depthFirstSearch( 'sample_data', 1, directed => false, max_depth => 2 -); + ); -PREPARE depthFirstSearch11 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_depthFirstSearch( + PREPARE depthFirstSearch11 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_depthFirstSearch( 'sample_data', 2, directed => false, max_depth => 2 -); + ); -PREPARE depthFirstSearch12 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_depthFirstSearch( + PREPARE depthFirstSearch12 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_depthFirstSearch( 'sample_data', 5, directed => false, max_depth => 2 -); + ); -PREPARE breadthFirstSearch10 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_breadthFirstSearch( + PREPARE breadthFirstSearch10 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_breadthFirstSearch( 'sample_data', 1, directed => false, max_depth => 2 -); + ); -PREPARE breadthFirstSearch11 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_breadthFirstSearch( + PREPARE breadthFirstSearch11 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_breadthFirstSearch( 'sample_data', 2, directed => false, max_depth => 2 -); + ); -PREPARE breadthFirstSearch12 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_breadthFirstSearch( + PREPARE breadthFirstSearch12 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_breadthFirstSearch( 'sample_data', 5, directed => false, max_depth => 2 -); + ); -RETURN QUERY -SELECT set_eq('depthFirstSearch10', 'breadthFirstSearch10', '10: max_depth => 2 cases (undirected)'); -RETURN QUERY -SELECT set_eq('depthFirstSearch11', 'breadthFirstSearch11', '11: max_depth => 2 cases (undirected)'); -RETURN QUERY -SELECT set_eq('depthFirstSearch12', 'breadthFirstSearch12', '12: max_depth => 2 cases (undirected)'); + RETURN QUERY + SELECT set_eq('depthFirstSearch10', 'breadthFirstSearch10', '10: max_depth => 2 cases (undirected)'); + RETURN QUERY + SELECT set_eq('depthFirstSearch11', 'breadthFirstSearch11', '11: max_depth => 2 cases (undirected)'); + RETURN QUERY + SELECT set_eq('depthFirstSearch12', 'breadthFirstSearch12', '12: max_depth => 2 cases (undirected)'); --- max_depth 3 cases (directed) + -- max_depth 3 cases (directed) -PREPARE depthFirstSearch13 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_depthFirstSearch( + PREPARE depthFirstSearch13 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_depthFirstSearch( 'sample_data', 1, max_depth => 3 -); + ); -PREPARE depthFirstSearch14 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_depthFirstSearch( + PREPARE depthFirstSearch14 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_depthFirstSearch( 'sample_data', 2, max_depth => 3 -); + ); -PREPARE depthFirstSearch15 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_depthFirstSearch( + PREPARE depthFirstSearch15 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_depthFirstSearch( 'sample_data', 5, max_depth => 3 -); + ); -PREPARE breadthFirstSearch13 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_breadthFirstSearch( + PREPARE breadthFirstSearch13 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_breadthFirstSearch( 'sample_data', 1, max_depth => 3 -); + ); -PREPARE breadthFirstSearch14 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_breadthFirstSearch( + PREPARE breadthFirstSearch14 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_breadthFirstSearch( 'sample_data', 2, max_depth => 3 -); + ); -PREPARE breadthFirstSearch15 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_breadthFirstSearch( + PREPARE breadthFirstSearch15 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_breadthFirstSearch( 'sample_data', 5, max_depth => 3 -); + ); -RETURN QUERY -SELECT set_eq('depthFirstSearch13', 'breadthFirstSearch13', '13: max_depth => 3 cases (directed)'); -RETURN QUERY -SELECT set_eq('depthFirstSearch14', 'breadthFirstSearch14', '14: max_depth => 3 cases (directed)'); -RETURN QUERY -SELECT set_eq('depthFirstSearch15', 'breadthFirstSearch15', '15: max_depth => 3 cases (directed)'); + RETURN QUERY + SELECT set_eq('depthFirstSearch13', 'breadthFirstSearch13', '13: max_depth => 3 cases (directed)'); + RETURN QUERY + SELECT set_eq('depthFirstSearch14', 'breadthFirstSearch14', '14: max_depth => 3 cases (directed)'); + RETURN QUERY + SELECT set_eq('depthFirstSearch15', 'breadthFirstSearch15', '15: max_depth => 3 cases (directed)'); --- max_depth 3 cases (undirected) + -- max_depth 3 cases (undirected) -PREPARE depthFirstSearch16 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_depthFirstSearch( + PREPARE depthFirstSearch16 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_depthFirstSearch( 'sample_data', 1, directed => false, max_depth => 3 -); + ); -PREPARE breadthFirstSearch16 AS -SELECT depth, start_vid, node, edge, cost, agg_cost -FROM pgr_breadthFirstSearch( + PREPARE breadthFirstSearch16 AS + SELECT depth, start_vid, node, edge, cost, agg_cost + FROM pgr_breadthFirstSearch( 'sample_data', 1, directed => false, max_depth => 3 -); + ); -RETURN QUERY -SELECT set_eq('depthFirstSearch16', 'breadthFirstSearch16', '16: max_depth => 3 cases (undirected)'); + RETURN QUERY + SELECT set_eq('depthFirstSearch16', 'breadthFirstSearch16', '16: max_depth => 3 cases (undirected)'); END; $BODY$ diff --git a/pgtap/traversal/depthFirstSearch/edge_cases/directed.pg b/pgtap/traversal/depthFirstSearch/edge_cases/directed.pg index 832ebec12ad..77c9e20061f 100644 --- a/pgtap/traversal/depthFirstSearch/edge_cases/directed.pg +++ b/pgtap/traversal/depthFirstSearch/edge_cases/directed.pg @@ -46,11 +46,8 @@ RETURN QUERY SELECT is_empty('q1', '1: Graph with 0 edge and 0 vertex'); PREPARE depthFirstSearch2 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q1', - 5 -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch('q1', 5); RETURN QUERY SELECT set_eq('depthFirstSearch2', @@ -75,11 +72,8 @@ SELECT is_empty( ); PREPARE depthFirstSearch4 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q3', - 100 -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch('q3', 100); RETURN QUERY SELECT set_eq('depthFirstSearch4', @@ -92,17 +86,20 @@ SELECT set_eq('depthFirstSearch4', -- negative depth test PREPARE depthFirstSearch5 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q3', - 4, max_depth => -3 -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch('q3', 4, max_depth => -3); RETURN QUERY -SELECT throws_ok('depthFirstSearch5', +SELECT + CASE WHEN min_version('4.0.0') THEN + throws_ok('depthFirstSearch5', + 'XX000', 'Negative value found on ''max_depth''', + '5: Negative max_depth throws') + ELSE + throws_ok('depthFirstSearch5', 'P0001', 'Negative value found on ''max_depth''', - '5: Negative max_depth throws' -); + '5: Negative max_depth throws') + END; @@ -120,11 +117,8 @@ SELECT set_eq('q6', ); PREPARE depthFirstSearch7 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q6', - 6, directed => true -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch('q6', 6, directed => true); RETURN QUERY SELECT set_eq('depthFirstSearch7', @@ -148,25 +142,16 @@ SELECT set_eq('q8', ); PREPARE depthFirstSearch9 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q8', - ARRAY[10, 11], directed => true -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch( 'q8', ARRAY[10, 11], directed => true); PREPARE depthFirstSearch10 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q8', - ARRAY[10, 11], directed => true, max_depth => 0 -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch( 'q8', ARRAY[10, 11], directed => true, max_depth => 0); PREPARE depthFirstSearch11 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q8', - ARRAY[10, 11], directed => true, max_depth => 1 -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch( 'q8', ARRAY[10, 11], directed => true, max_depth => 1); RETURN QUERY SELECT set_eq('depthFirstSearch9', @@ -230,18 +215,12 @@ SELECT set_eq('q12', ); PREPARE depthFirstSearch13 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q12', - ARRAY[3, 6, 8], directed => true -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch('q12', ARRAY[3, 6, 8], directed => true); PREPARE depthFirstSearch14 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q12', - ARRAY[3, 6, 8], directed => true, max_depth => 1 -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch('q12', ARRAY[3, 6, 8], directed => true, max_depth => 1); RETURN QUERY @@ -281,8 +260,7 @@ SELECT set_eq('depthFirstSearch14', PREPARE q15 AS SELECT id, source, target, cost, reverse_cost FROM edges -WHERE (id >= 10 AND id <= 12) - OR id = 8 ORDER BY id; +WHERE id IN (8,10,11,12) ORDER BY id; RETURN QUERY SELECT set_eq('q15', @@ -296,25 +274,16 @@ SELECT set_eq('q15', ); PREPARE depthFirstSearch16 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q15', - ARRAY[7, 8, 11, 12], directed => true -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch( 'q15', ARRAY[7, 8, 11, 12], directed => true); PREPARE depthFirstSearch17 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q15', - ARRAY[7, 8, 11, 12], directed => true, max_depth => 1 -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch( 'q15', ARRAY[7, 8, 11, 12], directed => true, max_depth => 1); PREPARE depthFirstSearch18 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q15', - ARRAY[7, 8, 11, 12], directed => true, max_depth => 2 -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch( 'q15', ARRAY[7, 8, 11, 12], directed => true, max_depth => 2); RETURN QUERY SELECT set_eq('depthFirstSearch16', diff --git a/pgtap/traversal/depthFirstSearch/edge_cases/issue_1348.pg b/pgtap/traversal/depthFirstSearch/edge_cases/issue_1348.pg index 1b8b9976b64..258513749bc 100644 --- a/pgtap/traversal/depthFirstSearch/edge_cases/issue_1348.pg +++ b/pgtap/traversal/depthFirstSearch/edge_cases/issue_1348.pg @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - ********************************************************************PGR-GNU*/ +*******************************************************************PGR-GNU*/ BEGIN; UPDATE edges SET cost = sign(cost), reverse_cost = sign(reverse_cost); @@ -55,10 +55,7 @@ ORDER BY id; -- Query 1 (Directed) PREPARE q1 AS -SELECT * FROM pgr_depthFirstSearch ( - 'q0', - 3 -); +SELECT seq, depth, start_vid, node, edge, cost, agg_cost FROM pgr_depthFirstSearch ( 'q0', 3); RETURN QUERY SELECT set_eq('q1', @@ -74,10 +71,7 @@ SELECT set_eq('q1', -- Query 2 (Directed) PREPARE q2 AS -SELECT * FROM pgr_depthFirstSearch ( - 'q0', - 6 -); +SELECT seq, depth, start_vid, node, edge, cost, agg_cost FROM pgr_depthFirstSearch ( 'q0', 6); RETURN QUERY SELECT set_eq('q2', @@ -93,10 +87,7 @@ SELECT set_eq('q2', -- Query 3 (Directed with max_depth) PREPARE q3 AS -SELECT * FROM pgr_depthFirstSearch ( - 'q0', - 6, max_depth => 1 -); +SELECT seq, depth, start_vid, node, edge, cost, agg_cost FROM pgr_depthFirstSearch ( 'q0', 6, max_depth => 1); RETURN QUERY SELECT set_eq('q3', @@ -111,10 +102,7 @@ SELECT set_eq('q3', -- Query 4 (Vertex does not exist) PREPARE q4 AS -SELECT * FROM pgr_depthFirstSearch ( - 'q0', - 2 -); +SELECT seq, depth, start_vid, node, edge, cost, agg_cost FROM pgr_depthFirstSearch ( 'q0', 2); RETURN QUERY SELECT set_eq('q4', @@ -126,10 +114,7 @@ SELECT set_eq('q4', -- Query 5 (Undirected) PREPARE q5 AS -SELECT * FROM pgr_depthFirstSearch ( - 'q0', - 3, directed => false -); +SELECT seq, depth, start_vid, node, edge, cost, agg_cost FROM pgr_depthFirstSearch ( 'q0', 3, directed => false); RETURN QUERY SELECT set_eq('q5', @@ -145,10 +130,7 @@ SELECT set_eq('q5', -- Query 6 (Undirected) PREPARE q6 AS -SELECT * FROM pgr_depthFirstSearch ( - 'q0', - 6, directed => false -); +SELECT seq, depth, start_vid, node, edge, cost, agg_cost FROM pgr_depthFirstSearch ( 'q0', 6, directed => false); RETURN QUERY SELECT set_eq('q6', @@ -164,10 +146,7 @@ SELECT set_eq('q6', -- Query 7 (Undirected with max_depth) PREPARE q7 AS -SELECT * FROM pgr_depthFirstSearch ( - 'q0', - 6, directed => false, max_depth => 1 -); +SELECT seq, depth, start_vid, node, edge, cost, agg_cost FROM pgr_depthFirstSearch ( 'q0', 6, directed => false, max_depth => 1); RETURN QUERY SELECT set_eq('q7', @@ -183,10 +162,7 @@ SELECT set_eq('q7', -- Query 8 (Multiple Vertices) PREPARE q8 AS -SELECT * FROM pgr_depthFirstSearch ( - 'q0', - ARRAY[6, 3, 6] -); +SELECT seq, depth, start_vid, node, edge, cost, agg_cost FROM pgr_depthFirstSearch ( 'q0', ARRAY[6, 3, 6]); RETURN QUERY SELECT set_eq('q8', @@ -208,5 +184,5 @@ LANGUAGE plpgsql; SELECT issue(); -SELECT * FROM finish(); +SELECT finish(); ROLLBACK; diff --git a/pgtap/traversal/depthFirstSearch/edge_cases/undirected.pg b/pgtap/traversal/depthFirstSearch/edge_cases/undirected.pg index 45bf9b38b70..d810bde26b4 100644 --- a/pgtap/traversal/depthFirstSearch/edge_cases/undirected.pg +++ b/pgtap/traversal/depthFirstSearch/edge_cases/undirected.pg @@ -46,11 +46,8 @@ RETURN QUERY SELECT is_empty('q1', '1: Graph with 0 edge and 0 vertex'); PREPARE depthFirstSearch2 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q1', - 5, directed => false -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch('q1', 5, directed => false); RETURN QUERY SELECT set_eq('depthFirstSearch2', @@ -75,11 +72,8 @@ SELECT is_empty( ); PREPARE depthFirstSearch4 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q3', - 100, directed => false -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch('q3', 100, directed => false); RETURN QUERY SELECT set_eq('depthFirstSearch4', @@ -92,17 +86,20 @@ SELECT set_eq('depthFirstSearch4', -- negative depth test PREPARE depthFirstSearch5 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q3', - 4, directed => false, max_depth => -3 -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch('q3', 4, directed => false, max_depth => -3); RETURN QUERY -SELECT throws_ok('depthFirstSearch5', +SELECT + CASE WHEN min_version('4.0.0') THEN + throws_ok('depthFirstSearch5', + 'XX000', 'Negative value found on ''max_depth''', + '5: Negative max_depth throws') + ELSE + throws_ok('depthFirstSearch5', 'P0001', 'Negative value found on ''max_depth''', - '5: Negative max_depth throws' -); + '5: Negative max_depth throws') + END; @@ -120,11 +117,8 @@ SELECT set_eq('q6', ); PREPARE depthFirstSearch7 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q6', - 6, directed => false -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch('q6', 6, directed => false); RETURN QUERY SELECT set_eq('depthFirstSearch7', @@ -148,25 +142,16 @@ SELECT set_eq('q8', ); PREPARE depthFirstSearch9 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q8', - ARRAY[10, 11], directed => false -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch('q8', ARRAY[10, 11], directed => false); PREPARE depthFirstSearch10 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q8', - ARRAY[10, 11], directed => false, max_depth => 0 -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch('q8', ARRAY[10, 11], directed => false, max_depth => 0); PREPARE depthFirstSearch11 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q8', - ARRAY[10, 11], directed => false, max_depth => 1 -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch('q8', ARRAY[10, 11], directed => false, max_depth => 1); RETURN QUERY SELECT set_eq('depthFirstSearch9', @@ -232,18 +217,12 @@ SELECT set_eq('q12', ); PREPARE depthFirstSearch13 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q12', - ARRAY[3, 6, 8], directed => false -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch('q12', ARRAY[3, 6, 8], directed => false); PREPARE depthFirstSearch14 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q12', - ARRAY[3, 6, 8], directed => false, max_depth => 1 -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch('q12', ARRAY[3, 6, 8], directed => false, max_depth => 1); RETURN QUERY @@ -285,7 +264,7 @@ SELECT set_eq('depthFirstSearch14', PREPARE q15 AS SELECT id, source, target, cost, reverse_cost FROM edges -WHERE id IN (8,10,11,12); +WHERE id IN (8,10,11,12) ORDER BY id; RETURN QUERY SELECT set_eq('q15', @@ -299,27 +278,16 @@ SELECT set_eq('q15', ); PREPARE depthFirstSearch16 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q15', - ARRAY[7, 8, 11, 12], directed => false -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch( 'q15', ARRAY[7, 8, 11, 12], directed => false); PREPARE depthFirstSearch17 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q15', - ARRAY[7, 8, 11, 12], directed => false, max_depth => 1 -); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch( 'q15', ARRAY[7, 8, 11, 12], directed => false, max_depth => 1); PREPARE depthFirstSearch18 AS -SELECT * -FROM pgr_depthFirstSearch( - 'q15', - ARRAY[7, 8, 11, 12], directed => false, max_depth => 2 -); - -PERFORM todo_start('sometimes this tests fails'); +SELECT seq,depth,start_vid,node,edge,cost,agg_cost +FROM pgr_depthFirstSearch( 'q15', ARRAY[7, 8, 11, 12], directed => false, max_depth => 2); RETURN QUERY SELECT set_eq('depthFirstSearch16', @@ -386,7 +354,6 @@ SELECT set_eq('depthFirstSearch18', '18: 4 vertices tests' ); -PERFORM todo_end(); END; $BODY$ LANGUAGE plpgsql; diff --git a/pgtap/traversal/depthFirstSearch/types_check.pg b/pgtap/traversal/depthFirstSearch/types_check.pg index 0bb369bae21..3468ddcef21 100644 --- a/pgtap/traversal/depthFirstSearch/types_check.pg +++ b/pgtap/traversal/depthFirstSearch/types_check.pg @@ -19,45 +19,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ********************************************************************PGR-GNU*/ BEGIN; -UPDATE edges SET cost = sign(cost), reverse_cost = sign(reverse_cost); -SELECT CASE WHEN min_version('3.2.0') THEN plan (7) ELSE plan(1) END; +SELECT CASE WHEN min_version('4.0.0') THEN plan(7) WHEN min_version('3.2.0') THEN plan(6) ELSE plan(1) END; -CREATE OR REPLACE FUNCTION types_check() -RETURNS SETOF TEXT AS -$BODY$ -BEGIN - -IF NOT min_version('3.2.0') THEN - RETURN QUERY - SELECT skip(1, 'Function is new on 3.2.0'); - RETURN; -END IF; - - -RETURN QUERY SELECT has_function('pgr_depthfirstsearch'); -RETURN QUERY SELECT has_function('pgr_depthfirstsearch', ARRAY['text','bigint','boolean','bigint']); -RETURN QUERY SELECT has_function('pgr_depthfirstsearch', ARRAY['text','anyarray','boolean','bigint']); -RETURN QUERY SELECT function_returns('pgr_depthfirstsearch', ARRAY['text','bigint','boolean','bigint'], 'setof record'); -RETURN QUERY SELECT function_returns('pgr_depthfirstsearch', ARRAY['text','anyarray','boolean','bigint'], 'setof record'); - -RETURN QUERY -SELECT function_args_eq('pgr_depthfirstsearch', - $$SELECT '{"","","directed","max_depth","seq","depth","start_vid","node","edge","cost","agg_cost"}'::TEXT[] $$ -); - --- parameter types -RETURN QUERY -SELECT function_types_eq('pgr_depthfirstsearch', - $$VALUES - ('{text,int8,bool,int8,int8,int8,int8,int8,int8,float8,float8}'::TEXT[]), - ('{text,anyarray,bool,int8,int8,int8,int8,int8,int8,float8,float8}'::TEXT[]) - $$ -); -END; -$BODY$ -LANGUAGE plpgsql; - -SELECT types_check(); +SELECT traversal_types_check('pgr_depthfirstsearch', created_v=> '3.2.0', standard_v => '4.0.0'); SELECT finish(); ROLLBACK; diff --git a/sql/breadthFirstSearch/_breadthFirstSearch.sql b/sql/breadthFirstSearch/_breadthFirstSearch.sql index 523610077d4..23dc7617508 100644 --- a/sql/breadthFirstSearch/_breadthFirstSearch.sql +++ b/sql/breadthFirstSearch/_breadthFirstSearch.sql @@ -5,7 +5,7 @@ Copyright (c) 2019 pgRouting developers Mail: project@pgrouting.org Copyright (c) 2019 Gudesa Venkata Sai Akhil -Mail: gvs.akhil1997@gmail.com +Mail: gvs.akhil1997 at gmail.com ------ @@ -24,18 +24,13 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ********************************************************************PGR-GNU*/ -------------------------- -------------------------- --- _breadthFirstSearch -------------------------- -------------------------- --v3.0 CREATE FUNCTION _pgr_breadthFirstSearch( - edges_sql TEXT, - from_vids ANYARRAY, - max_depth BIGINT, - directed BOOLEAN, + TEXT, --edges + ANYARRAY, -- roots + BIGINT, -- max depth + BOOLEAN, --directed OUT seq BIGINT, OUT depth BIGINT, @@ -43,14 +38,11 @@ CREATE FUNCTION _pgr_breadthFirstSearch( OUT node BIGINT, OUT edge BIGINT, OUT cost FLOAT, - OUT agg_cost FLOAT) - + OUT agg_cost FLOAT, + OUT pred BIGINT) RETURNS SETOF RECORD AS 'MODULE_PATHNAME' -LANGUAGE c IMMUTABLE STRICT; - - --- COMMENTS +LANGUAGE C VOLATILE STRICT; COMMENT ON FUNCTION _pgr_breadthFirstSearch(TEXT, ANYARRAY, BIGINT, BOOLEAN) IS 'pgRouting internal function'; diff --git a/sql/breadthFirstSearch/breadthFirstSearch.sql b/sql/breadthFirstSearch/breadthFirstSearch.sql index 8f235c6e1fd..4d1c6a5b788 100644 --- a/sql/breadthFirstSearch/breadthFirstSearch.sql +++ b/sql/breadthFirstSearch/breadthFirstSearch.sql @@ -6,7 +6,7 @@ Mail: project@pgrouting.org Function's developer: Copyright (c) 2019 Gudesa Venkata Sai Akhil -Mail: gvs.akhil1997@gmail.com +Mail: gvs.akhil1997 at gmail.com ------ @@ -26,103 +26,78 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ********************************************************************PGR-GNU*/ ------------------- --- pgr_breadthFirstSearch ------------------- - - --ONE TO DEPTH --v3.0 CREATE FUNCTION pgr_breadthFirstSearch( TEXT, -- edges_sql (required) - BIGINT, -- from_vid (required) + BIGINT, -- root_vid (required) - max_depth BIGINT DEFAULT 9223372036854775807, directed BOOLEAN DEFAULT true, + max_depth BIGINT DEFAULT 9223372036854775807, OUT seq BIGINT, OUT depth BIGINT, OUT start_vid BIGINT, + OUT pred BIGINT, OUT node BIGINT, OUT edge BIGINT, OUT cost FLOAT, OUT agg_cost FLOAT) - RETURNS SETOF RECORD AS $BODY$ -BEGIN - IF $3 < 0 THEN - RAISE EXCEPTION 'Negative value found on ''max_depth''' - USING HINT = format('Value found: %s', $3); - END IF; - - - RETURN QUERY - SELECT a.seq, a.depth, a.start_vid, a.node, a.edge, a.cost, a.agg_cost - FROM _pgr_breadthFirstSearch(_pgr_get_statement($1), ARRAY[$2]::BIGINT[], max_depth, directed) AS a; -END; + SELECT seq, depth, start_vid, pred, node, edge, cost, agg_cost + FROM _pgr_breadthFirstSearch(_pgr_get_statement($1), ARRAY[$2]::BIGINT[], max_depth, directed); $BODY$ -LANGUAGE plpgsql VOLATILE STRICT; +LANGUAGE SQL VOLATILE STRICT; --MANY TO DEPTH --v3.0 CREATE FUNCTION pgr_breadthFirstSearch( TEXT, -- edges_sql (required) - ANYARRAY, -- from_vids (required) + ANYARRAY, -- root_vids (required) - max_depth BIGINT DEFAULT 9223372036854775807, directed BOOLEAN DEFAULT true, + max_depth BIGINT DEFAULT 9223372036854775807, OUT seq BIGINT, OUT depth BIGINT, OUT start_vid BIGINT, + OUT pred BIGINT, OUT node BIGINT, OUT edge BIGINT, OUT cost FLOAT, OUT agg_cost FLOAT) - RETURNS SETOF RECORD AS $BODY$ -BEGIN - IF $3 < 0 THEN - RAISE EXCEPTION 'Negative value found on ''max_depth''' - USING HINT = format('Value found: %s', $3); - END IF; - - - RETURN QUERY - SELECT a.seq, a.depth, a.start_vid, a.node, a.edge, a.cost, a.agg_cost - FROM _pgr_breadthFirstSearch(_pgr_get_statement($1), $2::BIGINT[], max_depth, directed) AS a; -END; + SELECT seq, depth, start_vid, pred, node, edge, cost, agg_cost + FROM _pgr_breadthFirstSearch(_pgr_get_statement($1), $2::BIGINT[], max_depth, directed); $BODY$ -LANGUAGE plpgsql VOLATILE STRICT; +LANGUAGE SQL VOLATILE STRICT; --- COMMENTS - -COMMENT ON FUNCTION pgr_breadthFirstSearch(TEXT, BIGINT, BIGINT, BOOLEAN) +COMMENT ON FUNCTION pgr_breadthFirstSearch(TEXT, BIGINT, BOOLEAN, BIGINT) IS 'pgr_breadthFirstSearch(One to Depth) - EXPERIMENTAL - Parameters: - - edges SQL with columns: id, source, target, cost [,reverse_cost] - - From vertex identifier -- Optional Parameters: - - Maximum Depth := 9223372036854775807 + - Edges SQL with columns: id, source, target, cost [,reverse_cost] + - From root vertex identifier +- Optional parameters - directed := true + - max_depth := 9223372036854775807 - Documentation: - ${PROJECT_DOC_LINK}/pgr_breadthFirstSearch.html '; -COMMENT ON FUNCTION pgr_breadthFirstSearch(TEXT, ANYARRAY, BIGINT, BOOLEAN) +COMMENT ON FUNCTION pgr_breadthFirstSearch(TEXT, ANYARRAY, BOOLEAN, BIGINT) IS 'pgr_breadthFirstSearch(Many to Depth) - EXPERIMENTAL - Parameters: - Edges SQL with columns: id, source, target, cost [,reverse_cost] - - From ARRAY[vertices identifiers] -- Optional Parameters - - Maximum Depth := 9223372036854775807 - - directed := true + - From ARRAY[root vertices identifiers] +- Optional parameters + - directed := true + - max_depth := 9223372036854775807 - Documentation: - ${PROJECT_DOC_LINK}/pgr_breadthFirstSearch.html '; diff --git a/sql/scripts/build-extension-update-files.pl b/sql/scripts/build-extension-update-files.pl index 67c1f7c3039..7361699e820 100755 --- a/sql/scripts/build-extension-update-files.pl +++ b/sql/scripts/build-extension-update-files.pl @@ -275,19 +275,23 @@ sub generate_upgrade_script { if ($old_minor >= "3.2") { # Out parameters changed names on v4.0.0 - # Experimental functions push @commands, drop_special_case_function("pgr_dagshortestpath(text,text)"); push @commands, drop_special_case_function("pgr_sequentialvertexcoloring(text)"); push @commands, drop_special_case_function("pgr_bipartite(text)"); + + push @commands, drop_special_case_function("_pgr_depthfirstsearch(text,anyarray,boolean,bigint)"); + push @commands, drop_special_case_function("pgr_depthfirstsearch(text,anyarray,boolean,bigint)"); + push @commands, drop_special_case_function("pgr_depthfirstsearch(text,bigint,boolean,bigint)"); } if ($old_minor >= "3.3") { push @commands, drop_special_case_function("pgr_edgecoloring(text)"); } + push @commands, drop_special_case_function("_pgr_breadthfirstsearch(text,anyarray,bigint,boolean)"); + # Row type defined by OUT parameters is different. # Out parameters changed names on v4.0.0 - # Experimental functions push @commands, drop_special_case_function("pgr_bellmanford(text,bigint,bigint,boolean)"); push @commands, drop_special_case_function("pgr_bellmanford(text,anyarray,bigint,boolean)"); @@ -297,6 +301,7 @@ sub generate_upgrade_script { push @commands, drop_special_case_function("pgr_binarybreadthfirstsearch(text,anyarray,bigint,boolean)"); push @commands, drop_special_case_function("pgr_binarybreadthfirstsearch(text,bigint,anyarray,boolean)"); + push @commands, drop_special_case_function("pgr_dagshortestpath(text,bigint,bigint)"); push @commands, drop_special_case_function("pgr_dagshortestpath(text,bigint,anyarray)"); push @commands, drop_special_case_function("pgr_dagshortestpath(text,anyarray,bigint)"); diff --git a/sql/sigs/pgrouting--4.0.sig b/sql/sigs/pgrouting--4.0.sig index b8c9d53666d..6df9fbfb4dd 100644 --- a/sql/sigs/pgrouting--4.0.sig +++ b/sql/sigs/pgrouting--4.0.sig @@ -67,8 +67,8 @@ pgr_boykovkolmogorov(text,bigint,anyarray) pgr_boykovkolmogorov(text,bigint,bigint) pgr_boykovkolmogorov(text,text) _pgr_breadthfirstsearch(text,anyarray,bigint,boolean) -pgr_breadthfirstsearch(text,anyarray,bigint,boolean) -pgr_breadthfirstsearch(text,bigint,bigint,boolean) +pgr_breadthfirstsearch(text,anyarray,boolean,bigint) +pgr_breadthfirstsearch(text,bigint,boolean,bigint) _pgr_bridges(text) pgr_bridges(text) _pgr_build_type() diff --git a/sql/traversal/_depthFirstSearch.sql b/sql/traversal/_depthFirstSearch.sql index 40e33b5ff30..3849bb2935e 100644 --- a/sql/traversal/_depthFirstSearch.sql +++ b/sql/traversal/_depthFirstSearch.sql @@ -7,7 +7,7 @@ Mail: project@pgrouting.org Function's developer: Copyright (c) 2020 Ashish Kumar -Mail: ashishkr23438@gmail.com +Mail: ashishkr23438 at gmail.com ------ @@ -27,18 +27,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ********************************************************************PGR-GNU*/ ---------------------------- --- _pgr_depthFirstSearch ---------------------------- - - --v3.2 CREATE FUNCTION _pgr_depthFirstSearch( - edges_sql TEXT, - root_vids ANYARRAY, - - directed BOOLEAN, - max_depth BIGINT, + TEXT, --edges + ANYARRAY, -- roots + BOOLEAN, --directed + BIGINT, -- max depth OUT seq BIGINT, OUT depth BIGINT, @@ -46,15 +40,11 @@ CREATE FUNCTION _pgr_depthFirstSearch( OUT node BIGINT, OUT edge BIGINT, OUT cost FLOAT, - OUT agg_cost FLOAT) + OUT agg_cost FLOAT, + OUT pred BIGINT) RETURNS SETOF RECORD AS 'MODULE_PATHNAME' LANGUAGE C VOLATILE STRICT; - --- COMMENTS - - COMMENT ON FUNCTION _pgr_depthFirstSearch(TEXT, ANYARRAY, BOOLEAN, BIGINT) IS 'pgRouting internal function'; - diff --git a/sql/traversal/depthFirstSearch.sql b/sql/traversal/depthFirstSearch.sql index 7f6d6cc253e..f029735ef17 100644 --- a/sql/traversal/depthFirstSearch.sql +++ b/sql/traversal/depthFirstSearch.sql @@ -7,7 +7,7 @@ Mail: project@pgrouting.org Function's developer: Copyright (c) 2020 Ashish Kumar -Mail: ashishkr23438@gmail.com +Mail: ashishkr23438 at gmail.com ------ @@ -27,16 +27,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ********************************************************************PGR-GNU*/ --------------------------- --- pgr_depthFirstSearch --------------------------- - - -- SINGLE VERTEX --v3.2 CREATE FUNCTION pgr_depthFirstSearch( - TEXT, -- edges_sql (required) - BIGINT, -- root_vid (required) + TEXT, -- edges sql (required) + BIGINT, -- root vid (required) directed BOOLEAN DEFAULT true, max_depth BIGINT DEFAULT 9223372036854775807, @@ -44,32 +39,24 @@ CREATE FUNCTION pgr_depthFirstSearch( OUT seq BIGINT, OUT depth BIGINT, OUT start_vid BIGINT, + OUT pred BIGINT, OUT node BIGINT, OUT edge BIGINT, OUT cost FLOAT, OUT agg_cost FLOAT) RETURNS SETOF RECORD AS $BODY$ -BEGIN - IF $4 < 0 THEN - RAISE EXCEPTION 'Negative value found on ''max_depth''' - USING HINT = format('Value found: %s', $4); - END IF; - - - RETURN QUERY - SELECT a.seq, a.depth, a.start_vid, a.node, a.edge, a.cost, a.agg_cost - FROM _pgr_depthFirstSearch(_pgr_get_statement($1), ARRAY[$2]::BIGINT[], directed, max_depth) AS a; -END; + SELECT seq, depth, start_vid, pred, node, edge, cost, agg_cost + FROM _pgr_depthFirstSearch(_pgr_get_statement($1), ARRAY[$2]::BIGINT[], directed, max_depth); $BODY$ -LANGUAGE plpgsql VOLATILE STRICT; +LANGUAGE SQL VOLATILE STRICT; -- MULTIPLE VERTICES --v3.2 CREATE FUNCTION pgr_depthFirstSearch( - TEXT, -- edges_sql (required) - ANYARRAY, -- root_vids (required) + TEXT, -- edges sql (required) + ANYARRAY, -- root vids (required) directed BOOLEAN DEFAULT true, max_depth BIGINT DEFAULT 9223372036854775807, @@ -77,52 +64,40 @@ CREATE FUNCTION pgr_depthFirstSearch( OUT seq BIGINT, OUT depth BIGINT, OUT start_vid BIGINT, + OUT pred BIGINT, OUT node BIGINT, OUT edge BIGINT, OUT cost FLOAT, OUT agg_cost FLOAT) RETURNS SETOF RECORD AS $BODY$ -BEGIN - IF $4 < 0 THEN - RAISE EXCEPTION 'Negative value found on ''max_depth''' - USING HINT = format('Value found: %s', $4); - END IF; - - - RETURN QUERY - SELECT a.seq, a.depth, a.start_vid, a.node, a.edge, a.cost, a.agg_cost - FROM _pgr_depthFirstSearch(_pgr_get_statement($1), $2, directed, max_depth) AS a; -END; + SELECT seq, depth, start_vid, pred, node, edge, cost, agg_cost + FROM _pgr_depthFirstSearch(_pgr_get_statement($1), $2, directed, max_depth); $BODY$ -LANGUAGE plpgsql VOLATILE STRICT; - - --- COMMENTS - +LANGUAGE SQL VOLATILE STRICT; COMMENT ON FUNCTION pgr_depthFirstSearch(TEXT, BIGINT, BOOLEAN, BIGINT) IS 'pgr_depthFirstSearch(Single Vertex) - PROPOSED - Parameters: - - Edges SQL with columns: id, source, target, cost [,reverse_cost] - - From root vertex identifier + - Edges SQL with columns: id, source, target, cost [,reverse_cost] + - From root vertex identifier - Optional parameters - - directed := true - - max_depth := 9223372036854775807 + - directed := true + - max_depth := 9223372036854775807 - Documentation: - - ${PROJECT_DOC_LINK}/pgr_depthFirstSearch.html + - ${PROJECT_DOC_LINK}/pgr_depthFirstSearch.html '; COMMENT ON FUNCTION pgr_depthFirstSearch(TEXT, ANYARRAY, BOOLEAN, BIGINT) IS 'pgr_depthFirstSearch(Multiple Vertices) - PROPOSED - Parameters: - - Edges SQL with columns: id, source, target, cost [,reverse_cost] - - From ARRAY[root vertices identifiers] + - Edges SQL with columns: id, source, target, cost [,reverse_cost] + - From ARRAY[root vertices identifiers] - Optional parameters - - directed := true - - max_depth := 9223372036854775807 + - directed := true + - max_depth := 9223372036854775807 - Documentation: - - ${PROJECT_DOC_LINK}/pgr_depthFirstSearch.html + - ${PROJECT_DOC_LINK}/pgr_depthFirstSearch.html '; diff --git a/src/breadthFirstSearch/breadthFirstSearch.c b/src/breadthFirstSearch/breadthFirstSearch.c index 7ed6be67318..75a3ded41de 100644 --- a/src/breadthFirstSearch/breadthFirstSearch.c +++ b/src/breadthFirstSearch/breadthFirstSearch.c @@ -7,7 +7,7 @@ Mail: project@pgrouting.org Function's developer: Copyright (c) 2019 Gudesa Venkata Sai Akhil -Mail: gvs.akhil1997@gmail.com +Mail: gvs.akhil1997 at gmail.com ------ @@ -49,6 +49,7 @@ process( MST_rt **result_tuples, size_t *result_count) { + if (max_depth < 0) pgr_throw_error("Negative value found on 'max_depth'", ""); pgr_SPI_connect(); char* log_msg = NULL; char* notice_msg = NULL; @@ -56,7 +57,6 @@ process( (*result_tuples) = NULL; (*result_count) = 0; - clock_t start_t = clock(); pgr_do_breadthFirstSearch( edges_sql, @@ -127,7 +127,7 @@ PGDLLEXPORT Datum _pgr_breadthfirstsearch(PG_FUNCTION_ARGS) { Datum *values; bool *nulls; - size_t numb = 7; + size_t numb = 8; values = palloc(numb * sizeof(Datum)); nulls = palloc(numb * sizeof(bool)); @@ -136,13 +136,14 @@ PGDLLEXPORT Datum _pgr_breadthfirstsearch(PG_FUNCTION_ARGS) { nulls[i] = false; } - values[0] = Int32GetDatum((int32_t)funcctx->call_cntr + 1); + values[0] = Int64GetDatum((int64_t)funcctx->call_cntr + 1); values[1] = Int64GetDatum(result_tuples[funcctx->call_cntr].depth); values[2] = Int64GetDatum(result_tuples[funcctx->call_cntr].from_v); values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].node); values[4] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge); values[5] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost); values[6] = Float8GetDatum(result_tuples[funcctx->call_cntr].agg_cost); + values[7] = Int64GetDatum(result_tuples[funcctx->call_cntr].pred); tuple = heap_form_tuple(tuple_desc, values, nulls); diff --git a/src/traversal/depthFirstSearch.c b/src/traversal/depthFirstSearch.c index e3d70f4f211..4a6378d94b2 100644 --- a/src/traversal/depthFirstSearch.c +++ b/src/traversal/depthFirstSearch.c @@ -7,7 +7,7 @@ Mail: project@pgrouting.org Function's developer: Copyright (c) 2020 Ashish Kumar -Mail: ashishkr23438@gmail.com +Mail: ashishkr23438 at gmail.com ------ This program is free software; you can redistribute it and/or modify @@ -49,6 +49,7 @@ process( MST_rt **result_tuples, size_t *result_count) { + if (max_depth < 0) pgr_throw_error("Negative value found on 'max_depth'", ""); pgr_SPI_connect(); char* log_msg = NULL; char* notice_msg = NULL; @@ -126,7 +127,7 @@ PGDLLEXPORT Datum _pgr_depthfirstsearch(PG_FUNCTION_ARGS) { Datum *values; bool* nulls; - size_t num = 7; + size_t num = 8; values = palloc(num * sizeof(Datum)); nulls = palloc(num * sizeof(bool)); @@ -143,6 +144,8 @@ PGDLLEXPORT Datum _pgr_depthfirstsearch(PG_FUNCTION_ARGS) { values[4] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge); values[5] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost); values[6] = Float8GetDatum(result_tuples[funcctx->call_cntr].agg_cost); + values[7] = Int64GetDatum(result_tuples[funcctx->call_cntr].pred); + tuple = heap_form_tuple(tuple_desc, values, nulls); result = HeapTupleGetDatum(tuple);