-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathsearch.ts
102 lines (90 loc) · 2.98 KB
/
search.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import { createSelector } from 'reselect';
import {
RootState,
SearchResult,
SearchResults,
HitBlockMap,
RequesterBlockMap,
SortingOption,
AttributeWeights
} from '../types';
import { hitBlocklistSelector } from './hitBlocklist';
import {
filterBelowTOThreshold,
attributeWeightsSelector
} from './turkopticon';
import { sortBy } from '../utils/sorting';
const selectGroupId = (hit: SearchResult) => hit.groupId;
export const searchResultSelector = (state: RootState) => state.search;
export const sortOptionSelector = (state: RootState) => state.sortingOption;
export const requesterBlocklistSelector = (state: RootState) =>
state.requesterBlocklist;
export const resultsLengthSelector = createSelector(
[searchResultSelector],
(searchResults: SearchResults) => searchResults.size
);
const hideBlockedHits = createSelector(
[searchResultSelector, hitBlocklistSelector],
(hits: SearchResults, blockedHits: HitBlockMap) =>
hits.filter(
(hit: SearchResult) => !blockedHits.get(hit.groupId)
) as SearchResults
);
export const hideBlockedRequesters = createSelector(
[searchResultSelector, requesterBlocklistSelector],
(hits: SearchResults, blockedRequesters: RequesterBlockMap) =>
hits.filter(
(hit: SearchResult) => !blockedRequesters.get(hit.requester.id)
) as SearchResults
);
const hideBlockedRequestersAndHits = createSelector(
[hideBlockedHits, requesterBlocklistSelector],
(
resultsFilteredByBlockedIds: SearchResults,
blockedRequesters: RequesterBlockMap
) =>
resultsFilteredByBlockedIds.filter(
(result: SearchResult) => !blockedRequesters.get(result.requester.id)
) as SearchResults
);
const filteredAndSortedResults = createSelector(
[
hideBlockedRequestersAndHits,
filterBelowTOThreshold,
sortOptionSelector,
attributeWeightsSelector
],
(
hits: SearchResults,
aboveThreshold: SearchResults,
sortingOption: SortingOption,
weights: AttributeWeights
) =>
hits
.filter((hit: SearchResult) => aboveThreshold.has(hit.groupId))
.sort(sortBy(sortingOption, weights))
// .sort(unreadFirst) as SearchResults
);
export const newResults = createSelector(
[filteredAndSortedResults],
(hits: SearchResults) => hits.filter((hit: SearchResult) => !hit.markedAsRead)
);
export const newResultsGroupIdsList = createSelector(
[newResults],
(hits: SearchResults) => hits.map(selectGroupId).toList()
);
const markedAsReadResults = createSelector(
[filteredAndSortedResults],
(hits: SearchResults) =>
hits.filter((hit: SearchResult) => !!hit.markedAsRead)
);
const groupNewHitsBeforeOldHits = createSelector(
[newResults, markedAsReadResults],
(hits: SearchResults, readHits: SearchResults) => hits.concat(readHits)
);
export const filteredResultsGroupId = createSelector(
[groupNewHitsBeforeOldHits],
(hits: SearchResults) => {
return hits.map(selectGroupId).toList();
}
);