in elasticsearch/dsl/search_base.py [0:0]
def __getitem__(self, n: Union[int, slice]) -> Self:
"""
Support slicing the `Search` instance for pagination.
Slicing equates to the from/size parameters. E.g.::
s = Search().query(...)[0:25]
is equivalent to::
s = Search().query(...).extra(from_=0, size=25)
"""
s = self._clone()
if isinstance(n, slice):
# If negative slicing, abort.
if n.start and n.start < 0 or n.stop and n.stop < 0:
raise ValueError("Search does not support negative slicing.")
slice_start = n.start
slice_stop = n.stop
else: # This is an index lookup, equivalent to slicing by [n:n+1].
# If negative index, abort.
if n < 0:
raise ValueError("Search does not support negative indexing.")
slice_start = n
slice_stop = n + 1
old_from = s._extra.get("from")
old_to = None
if "size" in s._extra:
old_to = (old_from or 0) + s._extra["size"]
new_from = old_from
if slice_start is not None:
new_from = (old_from or 0) + slice_start
new_to = old_to
if slice_stop is not None:
new_to = (old_from or 0) + slice_stop
if old_to is not None and old_to < new_to:
new_to = old_to
if new_from is not None:
s._extra["from"] = new_from
if new_to is not None:
s._extra["size"] = max(0, new_to - (new_from or 0))
return s