operators.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. # dialects/postgresql/operators.py
  2. # Copyright (C) 2005-2025 the SQLAlchemy authors and contributors
  3. # <see AUTHORS file>
  4. #
  5. # This module is part of SQLAlchemy and is released under
  6. # the MIT License: https://www.opensource.org/licenses/mit-license.php
  7. # mypy: ignore-errors
  8. from ...sql import operators
  9. _getitem_precedence = operators._PRECEDENCE[operators.json_getitem_op]
  10. _eq_precedence = operators._PRECEDENCE[operators.eq]
  11. # JSON + JSONB
  12. ASTEXT = operators.custom_op(
  13. "->>",
  14. precedence=_getitem_precedence,
  15. natural_self_precedent=True,
  16. eager_grouping=True,
  17. )
  18. JSONPATH_ASTEXT = operators.custom_op(
  19. "#>>",
  20. precedence=_getitem_precedence,
  21. natural_self_precedent=True,
  22. eager_grouping=True,
  23. )
  24. # JSONB + HSTORE
  25. HAS_KEY = operators.custom_op(
  26. "?",
  27. precedence=_eq_precedence,
  28. natural_self_precedent=True,
  29. eager_grouping=True,
  30. is_comparison=True,
  31. )
  32. HAS_ALL = operators.custom_op(
  33. "?&",
  34. precedence=_eq_precedence,
  35. natural_self_precedent=True,
  36. eager_grouping=True,
  37. is_comparison=True,
  38. )
  39. HAS_ANY = operators.custom_op(
  40. "?|",
  41. precedence=_eq_precedence,
  42. natural_self_precedent=True,
  43. eager_grouping=True,
  44. is_comparison=True,
  45. )
  46. # JSONB
  47. DELETE_PATH = operators.custom_op(
  48. "#-",
  49. precedence=_getitem_precedence,
  50. natural_self_precedent=True,
  51. eager_grouping=True,
  52. )
  53. PATH_EXISTS = operators.custom_op(
  54. "@?",
  55. precedence=_eq_precedence,
  56. natural_self_precedent=True,
  57. eager_grouping=True,
  58. is_comparison=True,
  59. )
  60. PATH_MATCH = operators.custom_op(
  61. "@@",
  62. precedence=_eq_precedence,
  63. natural_self_precedent=True,
  64. eager_grouping=True,
  65. is_comparison=True,
  66. )
  67. # JSONB + ARRAY + HSTORE + RANGE
  68. CONTAINS = operators.custom_op(
  69. "@>",
  70. precedence=_eq_precedence,
  71. natural_self_precedent=True,
  72. eager_grouping=True,
  73. is_comparison=True,
  74. )
  75. CONTAINED_BY = operators.custom_op(
  76. "<@",
  77. precedence=_eq_precedence,
  78. natural_self_precedent=True,
  79. eager_grouping=True,
  80. is_comparison=True,
  81. )
  82. # ARRAY + RANGE
  83. OVERLAP = operators.custom_op(
  84. "&&",
  85. precedence=_eq_precedence,
  86. is_comparison=True,
  87. )
  88. # RANGE
  89. STRICTLY_LEFT_OF = operators.custom_op(
  90. "<<", precedence=_eq_precedence, is_comparison=True
  91. )
  92. STRICTLY_RIGHT_OF = operators.custom_op(
  93. ">>", precedence=_eq_precedence, is_comparison=True
  94. )
  95. NOT_EXTEND_RIGHT_OF = operators.custom_op(
  96. "&<", precedence=_eq_precedence, is_comparison=True
  97. )
  98. NOT_EXTEND_LEFT_OF = operators.custom_op(
  99. "&>", precedence=_eq_precedence, is_comparison=True
  100. )
  101. ADJACENT_TO = operators.custom_op(
  102. "-|-", precedence=_eq_precedence, is_comparison=True
  103. )
  104. # HSTORE
  105. GETITEM = operators.custom_op(
  106. "->",
  107. precedence=_getitem_precedence,
  108. natural_self_precedent=True,
  109. eager_grouping=True,
  110. )