protected function applyFilter($row, Filter $filter)
	{
		if (is_array($row) || $row instanceof \Traversable) {
			if ($filter instanceof FilterDate) {
				return $this->applyFilterDate($row, $filter);
			} elseif ($filter instanceof FilterMultiSelect) {
				return $this->applyFilterMultiSelect($row, $filter);
			} elseif ($filter instanceof FilterDateRange) {
				return $this->applyFilterDateRange($row, $filter);
			} elseif ($filter instanceof FilterRange) {
				return $this->applyFilterRange($row, $filter);
			}

			$condition = $filter->getCondition();

			foreach ($condition as $column => $value) {
				if ($filter instanceof FilterText && $filter->isExactSearch()) {
					return $row[$column] == $value;
				}

				if ($filter instanceof FilterText && $filter->hasSplitWordsSearch() === false) {
					$words = [$value];
				} else {
					$words = explode(' ', $value);
				}

				$row_value = strtolower(Strings::toAscii($row[$column]));

				foreach ($words as $word) {
					if (strpos($row_value, strtolower(Strings::toAscii($word))) !== false) {
						return $row;
					}
				}
			}
		}

		return false;
	}