| 2873 | ) |
| 2874 | |
| 2875 | def _format_frame_clause(self, range_, **kw): |
| 2876 | return "%s AND %s" % ( |
| 2877 | ( |
| 2878 | "UNBOUNDED PRECEDING" |
| 2879 | if range_[0] is elements.RANGE_UNBOUNDED |
| 2880 | else ( |
| 2881 | "CURRENT ROW" |
| 2882 | if range_[0] is elements.RANGE_CURRENT |
| 2883 | else ( |
| 2884 | "%s PRECEDING" |
| 2885 | % ( |
| 2886 | self.process( |
| 2887 | elements.literal(abs(range_[0])), **kw |
| 2888 | ), |
| 2889 | ) |
| 2890 | if range_[0] < 0 |
| 2891 | else "%s FOLLOWING" |
| 2892 | % (self.process(elements.literal(range_[0]), **kw),) |
| 2893 | ) |
| 2894 | ) |
| 2895 | ), |
| 2896 | ( |
| 2897 | "UNBOUNDED FOLLOWING" |
| 2898 | if range_[1] is elements.RANGE_UNBOUNDED |
| 2899 | else ( |
| 2900 | "CURRENT ROW" |
| 2901 | if range_[1] is elements.RANGE_CURRENT |
| 2902 | else ( |
| 2903 | "%s PRECEDING" |
| 2904 | % ( |
| 2905 | self.process( |
| 2906 | elements.literal(abs(range_[1])), **kw |
| 2907 | ), |
| 2908 | ) |
| 2909 | if range_[1] < 0 |
| 2910 | else "%s FOLLOWING" |
| 2911 | % (self.process(elements.literal(range_[1]), **kw),) |
| 2912 | ) |
| 2913 | ) |
| 2914 | ), |
| 2915 | ) |
| 2916 | |
| 2917 | def visit_over(self, over, **kwargs): |
| 2918 | text = over.element._compiler_dispatch(self, **kwargs) |