dbt-selly/dbt-env/lib/python3.8/site-packages/agate/table/distinct.py

48 lines
1.2 KiB
Python

#!/usr/bin/env python
# pylint: disable=W0212
from agate import utils
def distinct(self, key=None):
"""
Create a new table with only unique rows.
:param key:
Either the name of a single column to use to identify unique rows, a
sequence of such column names, a :class:`function` that takes a
row and returns a value to identify unique rows, or `None`, in
which case the entire row will be checked for uniqueness.
:returns:
A new :class:`.Table`.
"""
key_is_row_function = hasattr(key, '__call__')
key_is_sequence = utils.issequence(key)
uniques = []
rows = []
if self._row_names is not None:
row_names = []
else:
row_names = None
for i, row in enumerate(self._rows):
if key_is_row_function:
k = key(row)
elif key_is_sequence:
k = (row[j] for j in key)
elif key is None:
k = tuple(row)
else:
k = row[key]
if k not in uniques:
uniques.append(k)
rows.append(row)
if self._row_names is not None:
row_names.append(self._row_names[i])
return self._fork(rows, row_names=row_names)