diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6a9b9e25f64..664dde99906 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -23,6 +23,13 @@ Along with the check for filtering rows that can be updated, you can now set a p
(close #4142) (#4313)
+### docs: map Postgres operators to corresponding Hasura operators
+
+Map Postgres operators to corresponding Hasura operators at various places in docs and link to PG documentation for reference.
+For example, see [here](https://hasura.io/docs/1.0/graphql/manual/api-reference/schema-metadata-api/syntax-defs.html#operator).
+
+(#4502) (close #4056)
+
### Bug fixes and improvements
- server: add support for `_inc` on `real`, `double`, `numeric` and `money` (fix #3573)
diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md
index d1a45130066..b20673631e3 100644
--- a/docs/CONTRIBUTING.md
+++ b/docs/CONTRIBUTING.md
@@ -107,6 +107,11 @@ syntax in which case you'll have to set the language type to `none` to avoid war
- Use `:ref:` instead of `:doc:` to link to pages to avoid having to set the relative path and chances of broken links
while moving pages
+### Reference links
+
+- For external links, add a double `_` in the end to avoid `Duplicate explicit target name` warnings , e.g. \``Google __`\`
+- If you link to an external resource, make sure to link to the most current version of the same, e.g. `https://www.postgresql.org/docs/current/intro-whatis.html` rather than `https://www.postgresql.org/docs/9.6/intro-whatis.html`
+
### Pre-commit checks
- Just before committing your changes, delete your local `_build` folder completely and then build docs again. Scan
the output and look for any syntax warnings (e.g. title underline too short, could not lex literal block, etc.).
diff --git a/docs/graphql/manual/api-reference/graphql-api/query.rst b/docs/graphql/manual/api-reference/graphql-api/query.rst
index 05743aad2a7..7bf0ce7f452 100644
--- a/docs/graphql/manual/api-reference/graphql-api/query.rst
+++ b/docs/graphql/manual/api-reference/graphql-api/query.rst
@@ -422,33 +422,88 @@ ColumnExp
Operator
########
+
+.. _generic_operators:
+
**Generic operators (all column types except json, jsonb):**
-- ``_eq``
-- ``_neq``
-- ``_in``
-- ``_nin``
-- ``_gt``
-- ``_lt``
-- ``_gte``
-- ``_lte``
+.. list-table::
+ :header-rows: 1
+
+ * - Operator
+ - PostgreSQL equivalent
+ * - ``_eq``
+ - ``=``
+ * - ``_neq``
+ - ``<>``
+ * - ``_gt``
+ - ``>``
+ * - ``_lt``
+ - ``<``
+ * - ``_gte``
+ - ``>=``
+ * - ``_lte``
+ - ``<=``
+ * - ``_in``
+ - ``IN``
+ * - ``_nin``
+ - ``NOT IN``
+
+(For more details, refer to the Postgres docs for `comparison operators `__ and `list based search operators `_.)
+
+.. _text_operators:
**Text related operators:**
-- ``_like``
-- ``_nlike``
-- ``_ilike``
-- ``_nilike``
-- ``_similar``
-- ``_nsimilar``
+.. list-table::
+ :header-rows: 1
+
+ * - Operator
+ - PostgreSQL equivalent
+ * - ``_like``
+ - ``LIKE``
+ * - ``_nlike``
+ - ``NOT LIKE``
+ * - ``_ilike``
+ - ``ILIKE``
+ * - ``_nilike``
+ - ``NOT ILIKE``
+ * - ``_similar``
+ - ``SIMILAR TO``
+ * - ``_nsimilar``
+ - ``NOT SIMILAR TO``
+
+(For more details on text related operators, refer to the `Postgres docs `__.)
+
+.. _null_expression:
**Checking for NULL values:**
-- ``_is_null`` (takes true/false as values)
+.. list-table::
+ :header-rows: 1
+
+ * - Operator
+ - PostgreSQL equivalent
+ * - ``_is_null`` (takes true/false as values)
+ - ``IS NULL``
+
+(For more details on the ``IS NULL`` expression, refer to the `Postgres docs `__.)
+
+.. _type_casting:
**Type casting:**
-- ``_cast`` (takes a CastExp_ as a value)
+.. list-table::
+ :header-rows: 1
+
+ * - Operator
+ - PostgreSQL equivalent
+ * - ``_cast`` (takes a CastExp_ as a value)
+ - ``::``
+
+(For more details on type casting, refer to the `Postgres docs `__.)
+
+.. _jsonb_operators:
**JSONB operators:**
@@ -464,11 +519,13 @@ Operator
* - ``_has_key``
- ``?``
* - ``_has_keys_any``
- - ``?|``
+ - ``?!``
* - ``_has_keys_all``
- ``?&``
-(For more details on what these operators do, refer to the `Postgres docs `__).
+(For more details on JSONB operators, refer to the `Postgres docs `__.)
+
+.. _geometry_operators:
**PostGIS related operators on GEOMETRY columns:**
@@ -478,23 +535,23 @@ Operator
* - Operator
- PostGIS equivalent
* - ``_st_contains``
- - ``ST_Contains``
+ - ``ST_Contains(column, input)``
* - ``_st_crosses``
- - ``ST_Crosses``
+ - ``ST_Crosses(column, input)``
* - ``_st_equals``
- - ``ST_Equals``
+ - ``ST_Equals(column, input)``
* - ``_st_intersects``
- - ``ST_Intersects``
+ - ``ST_Intersects(column, input)``
* - ``_st_overlaps``
- - ``ST_Overlaps``
+ - ``ST_Overlaps(column, input)``
* - ``_st_touches``
- - ``ST_Touches``
+ - ``ST_Touches(column, input)``
* - ``_st_within``
- - ``ST_Within``
+ - ``ST_Within(column, input)``
* - ``_st_d_within``
- - ``ST_DWithin``
+ - ``ST_DWithin(column, input)``
-(For more details on what these operators do, refer to the `PostGIS docs `__).
+(For more details on spatial relationship operators, refer to the `PostGIS docs `__.)
.. note::
@@ -507,39 +564,27 @@ Operator
field-name : {_st_d_within: {distance: Float, from: Value} }
}
+.. _intersect_operators:
+
**Intersect Operators on RASTER columns:**
-- ``_st_intersects_rast``
+.. list-table::
+ :header-rows: 1
-Executes ``boolean ST_Intersects( raster , raster )``
-
-.. parsed-literal ::
-
- { _st_intersects_rast: raster }
-
-
-- ``_st_intersects_nband_geom``
-
-Executes ``boolean ST_Intersects( raster , integer nband , geometry geommin )``
-
-This accepts ``st_intersects_nband_geom_input`` input object
-
-.. parsed-literal ::
-
- { _st_intersects_nband_geom: {nband: Integer! geommin: geometry!}
-
-
-
-- ``_st_intersects_geom_nband``
-
-Executes ``boolean ST_Intersects( raster , geometry geommin , integer nband = NULL )``
-
-This accepts ``st_intersects_geom_nband_input`` input object
-
-.. parsed-literal ::
-
- { _st_intersects_geom_nband: {geommin: geometry! nband: Integer }
+ * - Operator
+ - PostgreSQL equivalent
+ - Input object
+ * - ``_st_intersects_rast``
+ - ``ST_Intersects(column, value)``
+ - ``{ _st_intersects_rast: raster }``
+ * - ``_st_intersects_nband_geom``
+ - ``ST_Intersects(column, nband, geommin)``
+ - ``{ _st_intersects_nband_geom: {nband: Integer! geommin: geometry!}``
+ * - ``_st_intersects_geom_nband``
+ - ``ST_Intersects(column, geommin, nband)``
+ - ``{ _st_intersects_geom_nband: {geommin: geometry! nband: Integer }``
+(For more details on intersect operators on ``raster`` columns refer to the `PostGIS docs `__.)
.. _CastExp:
diff --git a/docs/graphql/manual/api-reference/schema-metadata-api/syntax-defs.rst b/docs/graphql/manual/api-reference/schema-metadata-api/syntax-defs.rst
index e98e496a579..80fb8fdb309 100644
--- a/docs/graphql/manual/api-reference/schema-metadata-api/syntax-defs.rst
+++ b/docs/graphql/manual/api-reference/schema-metadata-api/syntax-defs.rst
@@ -290,36 +290,85 @@ Operator
**Generic operators (all column types except json, jsonb) :**
-- ``"$eq"``
-- ``"$ne"``
-- ``"$in"``
-- ``"$nin"``
-- ``"$gt"``
-- ``"$lt"``
-- ``"$gte"``
-- ``"$lte"``
+.. list-table::
+ :header-rows: 1
+
+ * - Operator
+ - PostgreSQL equivalent
+ * - ``"$eq"``
+ - ``=``
+ * - ``"$ne"``
+ - ``<>``
+ * - ``"$gt"``
+ - ``>``
+ * - ``"$lt"``
+ - ``<``
+ * - ``"$gte"``
+ - ``>=``
+ * - ``"$lte"``
+ - ``<=``
+ * - ``"$in"``
+ - ``IN``
+ * - ``"$nin"``
+ - ``NOT IN``
+
+(For more details, refer to the Postgres docs for `comparison operators `__ and `list based search operators `_.)
**Text related operators :**
-- ``"$like"``
-- ``"$nlike"``
-- ``"$ilike"``
-- ``"$nilike"``
-- ``"$similar"``
-- ``"$nsimilar"``
+.. list-table::
+ :header-rows: 1
+
+ * - Operator
+ - PostgreSQL equivalent
+ * - ``"$like"``
+ - ``LIKE``
+ * - ``"$nlike"``
+ - ``NOT LIKE``
+ * - ``"$ilike"``
+ - ``ILIKE``
+ * - ``"$nilike"``
+ - ``NOT ILIKE``
+ * - ``"$similar"``
+ - ``SIMILAR TO``
+ * - ``"$nsimilar"``
+ - ``NOT SIMILAR TO``
+
+(For more details on text related operators, refer to the `Postgres docs `__.)
**Operators for comparing columns (all column types except json, jsonb):**
-- ``"$ceq"``
-- ``"$cne"``
-- ``"$cgt"``
-- ``"$clt"``
-- ``"$cgte"``
-- ``"$clte"``
+.. list-table::
+ :header-rows: 1
+
+ * - Operator
+ - PostgreSQL equivalent
+ * - ``"$ceq"``
+ - ``=``
+ * - ``"$cne"``
+ - ``<>``
+ * - ``"$cgt"``
+ - ``>``
+ * - ``"$clt"``
+ - ``<``
+ * - ``"$cgte"``
+ - ``>=``
+ * - ``"$clte"``
+ - ``<=``
+
+(For more details on comparison operators, refer to the `Postgres docs `__.)
**Checking for NULL values :**
-- ``_is_null`` (takes true/false as values)
+.. list-table::
+ :header-rows: 1
+
+ * - Operator
+ - PostgreSQL equivalent
+ * - ``_is_null`` (takes true/false as values)
+ - ``IS NULL``
+
+(For more details on the ``IS NULL`` expression, refer to the `Postgres docs `__.)
**JSONB operators :**
@@ -335,11 +384,11 @@ Operator
* - ``_has_key``
- ``?``
* - ``_has_keys_any``
- - ``?|``
+ - ``?!``
* - ``_has_keys_all``
- ``?&``
-(For more details on what these operators do, refer to `Postgres docs `__.)
+(For more details on JSONB operators, refer to the `Postgres docs `__.)
**PostGIS related operators on GEOMETRY columns:**
@@ -349,23 +398,23 @@ Operator
* - Operator
- PostGIS equivalent
* - ``_st_contains``
- - ``ST_Contains``
+ - ``ST_Contains(column, input)``
* - ``_st_crosses``
- - ``ST_Crosses``
+ - ``ST_Crosses(column, input)``
* - ``_st_equals``
- - ``ST_Equals``
+ - ``ST_Equals(column, input)``
* - ``_st_intersects``
- - ``ST_Intersects``
+ - ``ST_Intersects(column, input)``
* - ``_st_overlaps``
- - ``ST_Overlaps``
+ - ``ST_Overlaps(column, input)``
* - ``_st_touches``
- - ``ST_Touches``
+ - ``ST_Touches(column, input)``
* - ``_st_within``
- - ``ST_Within``
+ - ``ST_Within(column, input)``
* - ``_st_d_within``
- - ``ST_DWithin``
+ - ``ST_DWithin(column, input)``
-(For more details on what these operators do, refer to `PostGIS docs `__).
+(For more details on spatial relationship operators, refer to the `PostGIS docs `__.)
.. note::
diff --git a/docs/graphql/manual/queries/query-filters.rst b/docs/graphql/manual/queries/query-filters.rst
index 4d69fffcc02..e1e58b972c7 100644
--- a/docs/graphql/manual/queries/query-filters.rst
+++ b/docs/graphql/manual/queries/query-filters.rst
@@ -69,6 +69,8 @@ The ``_eq`` (equal to) or the ``_neq`` (not equal to) operators are compatible w
``json`` or ``jsonB`` (like ``Integer``, ``Float``, ``Double``, ``Text``, ``Boolean``,
``Date``/``Time``/``Timestamp``, etc.).
+For more details on equality operators and Postgres equivalents, refer to the :ref:`API reference `.
+
The following are examples of using the equality operators on different types.
**Example: Integer (works with Double, Float, Numeric, etc.)**
@@ -206,6 +208,8 @@ The ``_gt`` (greater than), ``_lt`` (less than), ``_gte`` (greater than or equal
``_lte`` (less than or equal to) operators are compatible with any Postgres type other than ``json`` or ``jsonB``
(like ``Integer``, ``Float``, ``Double``, ``Text``, ``Boolean``, ``Date``/``Time``/``Timestamp``, etc.).
+For more details on greater than or less than operators and Postgres equivalents, refer to the :ref:`API reference `.
+
The following are examples of using these operators on different types:
@@ -331,6 +335,8 @@ The ``_in`` (in a list) and ``_nin`` (not in list) operators are used to compare
They are compatible with any Postgres type other than ``json`` or ``jsonB`` (like ``Integer``, ``Float``, ``Double``,
``Text``, ``Boolean``, ``Date``/``Time``/``Timestamp``, etc.).
+For more details on list based search operators and Postgres equivalents, refer to the :ref:`API reference `.
+
The following are examples of using these operators on different types:
**Example: Integer (works with Double, Float, etc.)**
@@ -422,7 +428,7 @@ Text search or pattern matching operators (_like, _similar, etc.)
The ``_like``, ``_nlike``, ``_ilike``, ``_nilike``, ``_similar``, ``_nsimilar`` operators are used for
pattern matching on string/text fields.
-These operators behave exactly like their `SQL counterparts `__
+For more details on text search operators and Postgres equivalents, refer to the :ref:`API reference `.
**Example: _like**
@@ -511,7 +517,7 @@ JSONB operators (_contains, _has_key, etc.)
The ``_contains``, ``_contained_in``, ``_has_key``, ``_has_keys_any`` and ``_has_keys_all`` operators are used to filter
based on ``JSONB`` columns.
-For more details on what these operators do, refer to `Postgres docs `__.
+For more details on JSONB operators and Postgres equivalents, refer to the :ref:`API reference `.
**Example: _contains**
@@ -602,8 +608,7 @@ The ``_st_contains``, ``_st_crosses``, ``_st_equals``, ``_st_intersects``, ``_st
``_st_d_within`` and ``_st_intersects`` can be used on ``geography`` columns also.
-For more details on what these operators do, refer to
-`PostGIS spatial relationship docs `_.
+For more details on spatial relationship operators and Postgres equivalents, refer to the :ref:`API reference `.
Use JSON representation (see `GeoJSON `_) of ``geometry`` and ``geography`` values in
``variables`` as shown in the following examples:
@@ -712,6 +717,8 @@ Filter or check for null values (_is_null)
Checking for null values can be achieved using the ``_is_null`` operator.
+For more details on the ``_is_null`` operator and Postgres equivalent, refer to the :ref:`API reference `.
+
**Example: Filter null values in a field**
Fetch a list of articles that have a value in the ``published_on`` field:
@@ -760,8 +767,9 @@ Intersect operators on RASTER columns (_st_intersects_rast, etc)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Intersect operators on columns with ``raster`` type are supported.
-Refer to `Postgis docs `__ to know more about intersect functions on ``raster`` columns.
-Please submit a feature request via `github `__ if you want support for more functions.
+Please submit a feature request via `GitHub `__ if you want support for more functions.
+
+For more details on intersect operators on raster columns and Postgres equivalents, refer to the :ref:`API reference `.
**Example: _st_intersects_rast**
@@ -975,7 +983,6 @@ Using multiple filters in the same query (_and, _or)
You can group multiple parameters in the same ``where`` argument using the ``_and`` or the ``_or`` operators to filter
results based on more than one criteria.
-
.. note::
You can use the ``_or`` and ``_and`` operators along with the ``_not`` operator to create arbitrarily complex boolean
expressions involving multiple filtering criteria.