Fix Row Filtering Part 2 (#1446)

```
Row Filtering
There can be multiple filters, a filter can match multiple columns (wildcard).
The semantics should be:
For row keep filters, if all filters match, the row is kept.
For row drop filters, if any filter matches, the row is dropped.

For an individual filter that specifies multiple columns, there is a match if any column matches.

Prior to PR 1433, the semantics for keep/drop were reversed; the semantics for multiple columns was correct.

PR 1433 corrected the semantics for keep/drop but broke the semantics for multiple columns.

This PR corrects the semantics for multiple columns.
```
This commit is contained in:
Ross Scroggs
2021-10-29 07:24:12 -07:00
committed by GitHub
parent a92326790d
commit 66811f8eb5

View File

@@ -154,27 +154,32 @@ def write_csv_file(csvRows, titles, list_type, todrive):
return True return True
return False return False
def rowFilterMatch(filters, columns, row): def filterMatch(filterVal, columns, row):
for c, filterVal in iter(filters.items()): for column in columns:
for column in columns[c]:
if filterVal[1] == 'regex': if filterVal[1] == 'regex':
if not filterVal[2].search(str(row.get(column, ''))):
return False
elif filterVal[1] == 'notregex':
if filterVal[2].search(str(row.get(column, ''))): if filterVal[2].search(str(row.get(column, ''))):
return False return True
elif filterVal[1] == 'notregex':
if not filterVal[2].search(str(row.get(column, ''))):
return True
elif filterVal[1] in ['date', 'time']: elif filterVal[1] in ['date', 'time']:
if not rowDateTimeFilterMatch( if rowDateTimeFilterMatch(
filterVal[1] == 'date', row.get(column, ''), filterVal[1] == 'date', row.get(column, ''),
filterVal[2], filterVal[3]): filterVal[2], filterVal[3]):
return False return True
elif filterVal[1] == 'count': elif filterVal[1] == 'count':
if not rowCountFilterMatch( if rowCountFilterMatch(
row.get(column, 0), filterVal[2], filterVal[3]): row.get(column, 0), filterVal[2], filterVal[3]):
return False return True
else: #boolean else: #boolean
if not rowBooleanFilterMatch( if rowBooleanFilterMatch(
row.get(column, False), filterVal[2]): row.get(column, False), filterVal[2]):
return True
return False
def rowFilterMatch(filters, columns, row):
for c, filterVal in iter(filters.items()):
if not filterMatch(filterVal, columns[c], row):
return False return False
return True return True