-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Adds common selectors for shared hparams #6732
Changes from 3 commits
89fc04a
bed9604
9eef734
f17fe22
ec93a93
901dbc2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -12,7 +12,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
See the License for the specific language governing permissions and | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
limitations under the License. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
==============================================================================*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import {createSelector} from '@ngrx/store'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import {createSelector, Selector} from '@ngrx/store'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import {State} from '../../../app_state'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getCurrentRouteRunSelection, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -33,6 +33,7 @@ import { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getDashboardHparamsAndMetricsSpecs, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getDashboardHparamFilterMap, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getDashboardDefaultHparamFilters, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getDashboardDisplayedHparamColumns, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} from '../../../hparams/_redux/hparams_selectors'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DiscreteFilter, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -44,6 +45,7 @@ import { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RunTableItem, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RunTableExperimentItem, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} from '../../../runs/views/runs_table/types'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import {getRunsTableHeaders} from '../../../runs/store/runs_selectors'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import {matchRunToRegex} from '../../../util/matcher'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import {isSingleRunPlugin, PluginType} from '../../data_source'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import {getNonEmptyCardIdsWithMetadata, TagMetadata} from '../../store'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -287,10 +289,49 @@ export const getPotentialHparamColumns = createSelector( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sortable: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
movable: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
filterable: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
hidable: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
})); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export const getSelectableColumns = createSelector( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getPotentialHparamColumns, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getDashboardDisplayedHparamColumns, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(potentialColumns, currentColumns) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const currentColumnNames = new Set(currentColumns.map(({name}) => name)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return potentialColumns.filter((columnHeader) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return !currentColumnNames.has(columnHeader.name); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** Returns a list of columns that have been sorted into logical groups. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Column order: | RUN | experimentAlias | HPARAMs | other | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export const getGroupedColumns = ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
headersSelector: Selector<object, ColumnHeader[]> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) => | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
createSelector( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
headersSelector, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getDashboardDisplayedHparamColumns, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(tableHeaders, hparamHeaders): ColumnHeader[] => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
...tableHeaders.filter((header) => header.type === 'RUN'), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
...tableHeaders.filter( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(header) => | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
header.type === 'CUSTOM' && header.name === 'experimentAlias' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
...hparamHeaders, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
...tableHeaders.filter( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(header) => | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
header.type !== 'RUN' && | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
!(header.type === 'CUSTOM' && header.name === 'experimentAlias') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not sure this approach of running a series of filters, then dumping everything which doesn't match at the end will scale if you end up with a handful of additional confitions.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I was also wondering about a more robust way to do this and you gave me an idea. I implemented something along these lines in |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export const getAllPotentialColumnsForCard = memoize((cardId: string) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return createSelector( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getColumnHeadersForCard(cardId), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is my opinion, feel free to push back.
We don't use the pattern of passing a selector to a selector anywhere else in the TB codebase. Due to this I expect this to confuse future devs coming to the project.
I would rather see this selectors projector moved to a utility function and shared by a series of selectors (not selector factories) created to select each type.
The result might look something like this
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is indeed a much simpler abstraction than passing around selectors as function arguments. I created a
groupColumns
helper similar to what you described. I put it in/widgets/data_table/utils.ts
because it doesn't really belong in the/metrics
directory.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I also moved the runs and metrics selectors to their respective directories, and added a simple selector test for each.