(self, over, **kwargs)
| 2915 | ) |
| 2916 | |
| 2917 | def visit_over(self, over, **kwargs): |
| 2918 | text = over.element._compiler_dispatch(self, **kwargs) |
| 2919 | if over.range_ is not None: |
| 2920 | range_ = "RANGE BETWEEN %s" % self._format_frame_clause( |
| 2921 | over.range_, **kwargs |
| 2922 | ) |
| 2923 | elif over.rows is not None: |
| 2924 | range_ = "ROWS BETWEEN %s" % self._format_frame_clause( |
| 2925 | over.rows, **kwargs |
| 2926 | ) |
| 2927 | elif over.groups is not None: |
| 2928 | range_ = "GROUPS BETWEEN %s" % self._format_frame_clause( |
| 2929 | over.groups, **kwargs |
| 2930 | ) |
| 2931 | else: |
| 2932 | range_ = None |
| 2933 | |
| 2934 | return "%s OVER (%s)" % ( |
| 2935 | text, |
| 2936 | " ".join( |
| 2937 | [ |
| 2938 | "%s BY %s" |
| 2939 | % (word, clause._compiler_dispatch(self, **kwargs)) |
| 2940 | for word, clause in ( |
| 2941 | ("PARTITION", over.partition_by), |
| 2942 | ("ORDER", over.order_by), |
| 2943 | ) |
| 2944 | if clause is not None and len(clause) |
| 2945 | ] |
| 2946 | + ([range_] if range_ else []) |
| 2947 | ), |
| 2948 | ) |
| 2949 | |
| 2950 | def visit_withingroup(self, withingroup, **kwargs): |
| 2951 | return "%s WITHIN GROUP (ORDER BY %s)" % ( |
nothing calls this directly
no test coverage detected