@@ -103,32 +103,39 @@ def connection_from_array_slice(
103
103
after = args .get ("after" )
104
104
first = args .get ("first" )
105
105
last = args .get ("last" )
106
+
106
107
if array_slice_length is None :
107
108
array_slice_length = len (array_slice )
108
109
slice_end = slice_start + array_slice_length
109
110
if array_length is None :
111
+ # Assume that the slice covers until the end of the result set
110
112
array_length = slice_end
111
113
112
114
start_offset = max (slice_start , 0 )
113
115
end_offset = min (slice_end , array_length )
114
116
117
+ first_edge_offset = 0
115
118
after_offset = get_offset_with_default (after , - 1 )
116
119
if 0 <= after_offset < array_length :
117
120
start_offset = max (start_offset , after_offset + 1 )
121
+ first_edge_offset = after_offset + 1
118
122
119
- before_offset = get_offset_with_default (before , end_offset )
123
+ last_edge_offset = array_length - 1
124
+ before_offset = get_offset_with_default (before , array_length )
120
125
if 0 <= before_offset < array_length :
121
126
end_offset = min (end_offset , before_offset )
127
+ last_edge_offset = before_offset - 1
128
+
129
+ number_edges_after_cursors = last_edge_offset - first_edge_offset + 1
122
130
123
131
if isinstance (first , int ):
124
132
if first < 0 :
125
133
raise ValueError ("Argument 'first' must be a non-negative integer." )
126
-
127
134
end_offset = min (end_offset , start_offset + first )
135
+
128
136
if isinstance (last , int ):
129
137
if last < 0 :
130
138
raise ValueError ("Argument 'last' must be a non-negative integer." )
131
-
132
139
start_offset = max (start_offset , end_offset - last )
133
140
134
141
# If supplied slice is too large, trim it down before mapping over it.
@@ -141,16 +148,28 @@ def connection_from_array_slice(
141
148
142
149
first_edge_cursor = edges [0 ].cursor if edges else None
143
150
last_edge_cursor = edges [- 1 ].cursor if edges else None
144
- lower_bound = after_offset + 1 if after else 0
145
- upper_bound = before_offset if before else array_length
151
+
152
+ # Determine hasPreviousPage
153
+ has_previous_page = False
154
+ if isinstance (last , int ):
155
+ has_previous_page = number_edges_after_cursors > last
156
+ elif after is not None :
157
+ has_previous_page = after_offset >= 0
158
+
159
+ # Determine hasNextPage
160
+ has_next_page = False
161
+ if isinstance (first , int ):
162
+ has_next_page = number_edges_after_cursors > first
163
+ elif before is not None :
164
+ has_next_page = before_offset < array_length
146
165
147
166
return connection_type (
148
167
edges = edges ,
149
168
pageInfo = page_info_type (
150
169
startCursor = first_edge_cursor ,
151
170
endCursor = last_edge_cursor ,
152
- hasPreviousPage = isinstance ( last , int ) and start_offset > lower_bound ,
153
- hasNextPage = isinstance ( first , int ) and end_offset < upper_bound ,
171
+ hasPreviousPage = has_previous_page ,
172
+ hasNextPage = has_next_page ,
154
173
),
155
174
)
156
175
0 commit comments