Skip to content

Commit 6bd8a39

Browse files
committed
Merge branch '729-allow-unequal-identifiers-inplace-volumetrics' into review
2 parents e8d4259 + 596a5ce commit 6bd8a39

File tree

19 files changed

+259
-82
lines changed

19 files changed

+259
-82
lines changed

backend_py/primary/primary/services/inplace_volumetrics_assembler/inplace_volumetrics_assembler.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -285,10 +285,10 @@ async def _get_volume_df_per_fluid_selection_and_categorized_result_names_async(
285285
)
286286

287287
# Get volume table per fluid selection - requested volumes and volumes needed for properties
288-
volume_df_per_fluid_selection: dict[FluidSelection, pl.DataFrame] = (
289-
await self._create_volume_df_per_fluid_selection(
290-
table_name, all_volume_names, fluid_zones, realizations, identifiers_with_values, accumulate_fluid_zones
291-
)
288+
volume_df_per_fluid_selection: dict[
289+
FluidSelection, pl.DataFrame
290+
] = await self._create_volume_df_per_fluid_selection(
291+
table_name, all_volume_names, fluid_zones, realizations, identifiers_with_values, accumulate_fluid_zones
292292
)
293293

294294
# If accumulate_fluid_zones is True, exclude BO and BG from valid properties

frontend/src/framework/WorkbenchServices.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { isEqual } from "lodash";
66

77
import { RegularEnsembleIdent } from "./RegularEnsembleIdent";
88
import { Workbench } from "./Workbench";
9-
import { InplaceVolumetricsFilter } from "./types/inplaceVolumetricsFilter";
9+
import { InplaceVolumetricsFilterSettings } from "./types/inplaceVolumetricsFilterSettings";
1010
import { Intersection } from "./types/intersection";
1111
import { Viewport } from "./types/viewport";
1212
import { Wellbore } from "./types/wellbore";
@@ -38,7 +38,7 @@ export type GlobalTopicDefinitions = {
3838
"global.syncValue.intersection": Intersection;
3939
"global.syncValue.cameraPositionIntersection": Viewport;
4040
"global.syncValue.verticalScale": number;
41-
"global.syncValue.inplaceVolumetricsFilter": InplaceVolumetricsFilter;
41+
"global.syncValue.inplaceVolumetricsFilterSettings": InplaceVolumetricsFilterSettings;
4242
"global.syncValue.inplaceVolumetricsResultName": string;
4343
};
4444

Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { FluidZone_api, InplaceVolumetricsIdentifierWithValues_api } from "@api";
22
import { RegularEnsembleIdent } from "@framework/RegularEnsembleIdent";
33

4-
export type InplaceVolumetricsFilter = {
4+
export type InplaceVolumetricsFilterSettings = {
55
ensembleIdents: RegularEnsembleIdent[];
66
tableNames: string[];
77
fluidZones: FluidZone_api[];
88
identifiersValues: InplaceVolumetricsIdentifierWithValues_api[];
9+
allowIdentifierValuesIntersection: boolean;
910
};
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import React from "react";
2+
3+
import { resolveClassNames } from "@lib/utils/resolveClassNames";
4+
5+
export type ErrorWrapperProps = {
6+
isError?: boolean;
7+
message?: string;
8+
children: React.ReactNode;
9+
};
10+
11+
export const ErrorWrapper: React.FC<ErrorWrapperProps> = (props) => {
12+
return (
13+
<div
14+
className={resolveClassNames("relative rounded", {
15+
"outline outline-red-100 outline-offset-2": props.isError ?? false,
16+
})}
17+
>
18+
{props.isError && props.message && (
19+
<div className="absolute left-0 right-0 w-full h-full bg-white bg-opacity-80 flex items-center justify-center z-10 p-4 text-center backdrop-blur-sm">
20+
{props.message}
21+
</div>
22+
)}
23+
{props.children}
24+
</div>
25+
);
26+
};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { ErrorWrapper } from "./errorWrapper";

frontend/src/modules/InplaceVolumetricsPlot/interfaces.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { InplaceVolumetricResultName_api } from "@api";
22
import { InterfaceInitialization } from "@framework/UniDirectionalModuleComponentsInterface";
3-
import { InplaceVolumetricsFilter } from "@framework/types/inplaceVolumetricsFilter";
43
import { SelectorColumn, SourceAndTableIdentifierUnion } from "@modules/_shared/InplaceVolumetrics/types";
54

65
import { userSelectedPlotTypeAtom } from "./settings/atoms/baseAtoms";
@@ -17,10 +16,10 @@ import {
1716
selectedSubplotByAtom,
1817
selectedTableNamesAtom,
1918
} from "./settings/atoms/derivedAtoms";
20-
import { PlotType } from "./typesAndEnums";
19+
import { InplaceVolumetricsFilterSelections, PlotType } from "./typesAndEnums";
2120

2221
export type SettingsToViewInterface = {
23-
filter: InplaceVolumetricsFilter;
22+
filter: InplaceVolumetricsFilterSelections;
2423
resultName: InplaceVolumetricResultName_api | null;
2524
resultName2: InplaceVolumetricResultName_api | null;
2625
selectorColumn: SelectorColumn | null;

frontend/src/modules/InplaceVolumetricsPlot/settings/atoms/baseAtoms.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { FluidZone_api, InplaceVolumetricResultName_api, InplaceVolumetricsIdentifierWithValues_api } from "@api";
22
import { RegularEnsembleIdent } from "@framework/RegularEnsembleIdent";
33
import { PlotType } from "@modules/InplaceVolumetricsPlot/typesAndEnums";
4+
import { IdentifierValueCriteria } from "@modules/_shared/InplaceVolumetrics/TableDefinitionsAccessor";
45
import {
56
SelectorColumn,
67
SourceAndTableIdentifierUnion,
@@ -19,3 +20,7 @@ export const userSelectedSelectorColumnAtom = atom<SelectorColumn | null>(null);
1920
export const userSelectedSubplotByAtom = atom<SourceAndTableIdentifierUnion>(SourceIdentifier.ENSEMBLE);
2021
export const userSelectedPlotTypeAtom = atom<PlotType>(PlotType.HISTOGRAM);
2122
export const userSelectedColorByAtom = atom<SourceAndTableIdentifierUnion>(SourceIdentifier.TABLE_NAME);
23+
24+
export const selectedIdentifierValueCriteriaAtom = atom<IdentifierValueCriteria>(
25+
IdentifierValueCriteria.REQUIRE_EQUALITY
26+
);

frontend/src/modules/InplaceVolumetricsPlot/settings/atoms/derivedAtoms.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { FixupSelection, fixupUserSelection } from "@lib/utils/fixupUserSelectio
55
import { fixupUserSelectedIdentifierValues } from "@modules/_shared/InplaceVolumetrics/fixupUserSelectedIdentifierValues";
66
import { RealSelector, SelectorColumn, SourceAndTableIdentifierUnion } from "@modules/_shared/InplaceVolumetrics/types";
77
import {
8+
IdentifierValueCriteria,
89
TableDefinitionsAccessor,
910
makeUniqueTableNamesIntersection,
1011
} from "@modules_shared/InplaceVolumetrics/TableDefinitionsAccessor";
@@ -50,7 +51,11 @@ export const tableDefinitionsAccessorAtom = atom<TableDefinitionsAccessor>((get)
5051
const selectedTableNames = get(selectedTableNamesAtom);
5152
const tableDefinitions = get(tableDefinitionsQueryAtom);
5253

53-
return new TableDefinitionsAccessor(tableDefinitions.isLoading ? [] : tableDefinitions.data, selectedTableNames);
54+
return new TableDefinitionsAccessor(
55+
tableDefinitions.isLoading ? [] : tableDefinitions.data,
56+
selectedTableNames,
57+
IdentifierValueCriteria.REQUIRE_EQUALITY
58+
);
5459
});
5560

5661
export const areTableDefinitionSelectionsValidAtom = atom<boolean>((get) => {

frontend/src/modules/InplaceVolumetricsPlot/settings/settings.tsx

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ import React from "react";
33
import { InplaceVolumetricResultName_api } from "@api";
44
import { ModuleSettingsProps } from "@framework/Module";
55
import { useEnsembleSet } from "@framework/WorkbenchSession";
6-
import { InplaceVolumetricsFilter } from "@framework/types/inplaceVolumetricsFilter";
6+
import { InplaceVolumetricsFilterSettings } from "@framework/types/inplaceVolumetricsFilterSettings";
77
import { CollapsibleGroup } from "@lib/components/CollapsibleGroup";
88
import { Dropdown, DropdownOption } from "@lib/components/Dropdown";
99
import { Label } from "@lib/components/Label";
10+
import { IdentifierValueCriteria } from "@modules/_shared/InplaceVolumetrics/TableDefinitionsAccessor";
1011
import { SelectorColumn } from "@modules/_shared/InplaceVolumetrics/types";
1112
import { RealSelector } from "@modules/_shared/InplaceVolumetrics/types";
1213
import { createHoverTextForVolume } from "@modules/_shared/InplaceVolumetrics/volumetricStringUtils";
@@ -15,6 +16,7 @@ import { InplaceVolumetricsFilterComponent } from "@modules/_shared/components/I
1516
import { useAtom, useAtomValue, useSetAtom } from "jotai";
1617

1718
import {
19+
selectedIdentifierValueCriteriaAtom,
1820
userSelectedColorByAtom,
1921
userSelectedEnsembleIdentsAtom,
2022
userSelectedFluidZonesAtom,
@@ -77,12 +79,20 @@ export function Settings(props: ModuleSettingsProps<Interfaces>): React.ReactNod
7779
const setSelectedColorBy = useSetAtom(userSelectedColorByAtom);
7880

7981
const [selectedPlotType, setSelectedPlotType] = useAtom(userSelectedPlotTypeAtom);
82+
const [selectedIdentifierValueCriteria, setSelectedIdentifierValueCriteria] = useAtom(
83+
selectedIdentifierValueCriteriaAtom
84+
);
8085

81-
function handleFilterChange(newFilter: InplaceVolumetricsFilter) {
86+
function handleFilterChange(newFilter: InplaceVolumetricsFilterSettings) {
8287
setSelectedEnsembleIdents(newFilter.ensembleIdents);
8388
setSelectedTableNames(newFilter.tableNames);
8489
setSelectedFluidZones(newFilter.fluidZones);
8590
setSelectedIdentifiersValues(newFilter.identifiersValues);
91+
setSelectedIdentifierValueCriteria(
92+
newFilter.allowIdentifierValuesIntersection
93+
? IdentifierValueCriteria.ALLOW_INTERSECTION
94+
: IdentifierValueCriteria.REQUIRE_EQUALITY
95+
);
8696
}
8797

8898
const resultNameOptions: DropdownOption<InplaceVolumetricResultName_api>[] = tableDefinitionsAccessor
@@ -168,6 +178,9 @@ export function Settings(props: ModuleSettingsProps<Interfaces>): React.ReactNod
168178
selectedFluidZones={selectedFluidZones}
169179
selectedIdentifiersValues={selectedIdentifiersValues}
170180
selectedTableNames={selectedTableNames}
181+
selectedAllowIdentifierValueIntersection={
182+
selectedIdentifierValueCriteria === IdentifierValueCriteria.ALLOW_INTERSECTION
183+
}
171184
onChange={handleFilterChange}
172185
additionalSettings={plotSettings}
173186
areCurrentlySelectedTablesComparable={tableDefinitionsAccessor.getAreTablesComparable()}

frontend/src/modules/InplaceVolumetricsPlot/typesAndEnums.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { InplaceVolumetricsFilterSettings } from "@framework/types/inplaceVolumetricsFilterSettings";
2+
13
export enum PlotType {
24
HISTOGRAM = "histogram",
35
SCATTER = "scatter",
@@ -15,3 +17,8 @@ export const plotTypeToStringMapping: Record<PlotType, string> = {
1517
[PlotType.BAR]: "Bar",
1618
[PlotType.CONVERGENCE]: "Convergence",
1719
};
20+
21+
export type InplaceVolumetricsFilterSelections = Omit<
22+
InplaceVolumetricsFilterSettings,
23+
"allowIdentifierValuesIntersection"
24+
>;

frontend/src/modules/InplaceVolumetricsPlot/view/atoms/baseAtoms.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { InplaceVolumetricResultName_api } from "@api";
2-
import { InplaceVolumetricsFilter } from "@framework/types/inplaceVolumetricsFilter";
3-
import { PlotType } from "@modules/InplaceVolumetricsPlot/typesAndEnums";
2+
import { InplaceVolumetricsFilterSelections, PlotType } from "@modules/InplaceVolumetricsPlot/typesAndEnums";
43
import {
54
SelectorColumn,
65
SourceAndTableIdentifierUnion,
@@ -9,7 +8,7 @@ import {
98

109
import { atom } from "jotai";
1110

12-
export const filterAtom = atom<InplaceVolumetricsFilter>({
11+
export const filterAtom = atom<InplaceVolumetricsFilterSelections>({
1312
ensembleIdents: [],
1413
tableNames: [],
1514
fluidZones: [],

frontend/src/modules/InplaceVolumetricsTable/interfaces.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { InplaceVolumetricResultName_api, InplaceVolumetricStatistic_api } from "@api";
22
import { InterfaceInitialization } from "@framework/UniDirectionalModuleComponentsInterface";
3-
import { InplaceVolumetricsFilter } from "@framework/types/inplaceVolumetricsFilter";
43
import { SourceAndTableIdentifierUnion, SourceIdentifier, TableType } from "@modules/_shared/InplaceVolumetrics/types";
54

65
import { selectedStatisticOptionsAtom, selectedTableTypeAtom } from "./settings/atoms/baseAtoms";
@@ -14,9 +13,10 @@ import {
1413
selectedResultNamesAtom,
1514
selectedTableNamesAtom,
1615
} from "./settings/atoms/derivedAtoms";
16+
import { InplaceVolumetricsFilterSelections } from "./types";
1717

1818
export type SettingsToViewInterface = {
19-
filter: InplaceVolumetricsFilter;
19+
filter: InplaceVolumetricsFilterSelections;
2020
areSelectedTablesComparable: boolean;
2121
resultNames: InplaceVolumetricResultName_api[];
2222
accumulationOptions: Omit<SourceAndTableIdentifierUnion, SourceIdentifier.ENSEMBLE | SourceIdentifier.TABLE_NAME>[];

frontend/src/modules/InplaceVolumetricsTable/settings/atoms/baseAtoms.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
InplaceVolumetricsIdentifierWithValues_api,
66
} from "@api";
77
import { RegularEnsembleIdent } from "@framework/RegularEnsembleIdent";
8+
import { IdentifierValueCriteria } from "@modules/_shared/InplaceVolumetrics/TableDefinitionsAccessor";
89
import { SourceAndTableIdentifierUnion, SourceIdentifier, TableType } from "@modules/_shared/InplaceVolumetrics/types";
910

1011
import { atom } from "jotai";
@@ -14,10 +15,14 @@ export const userSelectedTableNamesAtom = atom<string[] | null>(null);
1415
export const userSelectedFluidZonesAtom = atom<FluidZone_api[] | null>(null);
1516
export const userSelectedIdentifiersValuesAtom = atom<InplaceVolumetricsIdentifierWithValues_api[] | null>(null);
1617
export const userSelectedResultNamesAtom = atom<InplaceVolumetricResultName_api[]>([]);
18+
1719
export const userSelectedAccumulationOptionsAtom = atom<
1820
Omit<SourceAndTableIdentifierUnion, SourceIdentifier.ENSEMBLE | SourceIdentifier.TABLE_NAME>[] | null
1921
>(null);
2022
export const selectedTableTypeAtom = atom<TableType>(TableType.STATISTICAL);
2123
export const selectedStatisticOptionsAtom = atom<InplaceVolumetricStatistic_api[]>(
2224
Object.values(InplaceVolumetricStatistic_api)
2325
);
26+
export const selectedIdentifierValueCriteriaAtom = atom<IdentifierValueCriteria>(
27+
IdentifierValueCriteria.REQUIRE_EQUALITY
28+
);

frontend/src/modules/InplaceVolumetricsTable/settings/atoms/derivedAtoms.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
import { atom } from "jotai";
1313

1414
import {
15+
selectedIdentifierValueCriteriaAtom,
1516
userSelectedAccumulationOptionsAtom,
1617
userSelectedEnsembleIdentsAtom,
1718
userSelectedFluidZonesAtom,
@@ -44,8 +45,13 @@ export const selectedEnsembleIdentsAtom = atom((get) => {
4445
export const tableDefinitionsAccessorAtom = atom<TableDefinitionsAccessor>((get) => {
4546
const selectedTableNames = get(selectedTableNamesAtom);
4647
const tableDefinitions = get(tableDefinitionsQueryAtom);
48+
const selectedIdentifierValueCriteria = get(selectedIdentifierValueCriteriaAtom);
4749

48-
return new TableDefinitionsAccessor(tableDefinitions.isLoading ? [] : tableDefinitions.data, selectedTableNames);
50+
return new TableDefinitionsAccessor(
51+
tableDefinitions.isLoading ? [] : tableDefinitions.data,
52+
selectedTableNames,
53+
selectedIdentifierValueCriteria
54+
);
4955
});
5056

5157
export const areTableDefinitionSelectionsValidAtom = atom<boolean>((get) => {

frontend/src/modules/InplaceVolumetricsTable/settings/settings.tsx

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@ import React from "react";
33
import { InplaceVolumetricResultName_api, InplaceVolumetricStatistic_api } from "@api";
44
import { ModuleSettingsProps } from "@framework/Module";
55
import { useEnsembleSet } from "@framework/WorkbenchSession";
6-
import { InplaceVolumetricsFilter } from "@framework/types/inplaceVolumetricsFilter";
6+
import { InplaceVolumetricsFilterSettings } from "@framework/types/inplaceVolumetricsFilterSettings";
77
import { CollapsibleGroup } from "@lib/components/CollapsibleGroup";
88
import { Dropdown } from "@lib/components/Dropdown";
99
import { Label } from "@lib/components/Label";
1010
import { Select, SelectOption } from "@lib/components/Select";
1111
import { TagOption, TagPicker } from "@lib/components/TagPicker";
12+
import { IdentifierValueCriteria } from "@modules/_shared/InplaceVolumetrics/TableDefinitionsAccessor";
1213
import {
1314
InplaceVolumetricStatisticEnumToStringMapping,
1415
SourceAndTableIdentifierUnion,
@@ -22,6 +23,7 @@ import { InplaceVolumetricsFilterComponent } from "@modules/_shared/components/I
2223
import { useAtom, useAtomValue, useSetAtom } from "jotai";
2324

2425
import {
26+
selectedIdentifierValueCriteriaAtom,
2527
selectedStatisticOptionsAtom,
2628
selectedTableTypeAtom,
2729
userSelectedAccumulationOptionsAtom,
@@ -69,12 +71,20 @@ export function Settings(props: ModuleSettingsProps<Interfaces>): React.ReactNod
6971

7072
const [selectedTableType, setSelectedTableType] = useAtom(selectedTableTypeAtom);
7173
const [selectedStatisticOptions, setSelectedStatisticOptions] = useAtom(selectedStatisticOptionsAtom);
74+
const [selectedIdentifierValueCriteria, setSelectedIdentifierValueCriteria] = useAtom(
75+
selectedIdentifierValueCriteriaAtom
76+
);
7277

73-
function handleFilterChange(newFilter: InplaceVolumetricsFilter) {
78+
function handleFilterChange(newFilter: InplaceVolumetricsFilterSettings) {
7479
setSelectedEnsembleIdents(newFilter.ensembleIdents);
7580
setSelectedTableNames(newFilter.tableNames);
7681
setSelectedFluidZones(newFilter.fluidZones);
7782
setSelectedIdentifiersValues(newFilter.identifiersValues);
83+
setSelectedIdentifierValueCriteria(
84+
newFilter.allowIdentifierValuesIntersection
85+
? IdentifierValueCriteria.ALLOW_INTERSECTION
86+
: IdentifierValueCriteria.REQUIRE_EQUALITY
87+
);
7888
}
7989

8090
function handleAccumulationOptionsChange(
@@ -167,6 +177,9 @@ export function Settings(props: ModuleSettingsProps<Interfaces>): React.ReactNod
167177
selectedFluidZones={selectedFluidZones}
168178
selectedIdentifiersValues={selectedIdentifiersValues}
169179
selectedTableNames={selectedTableNames}
180+
selectedAllowIdentifierValueIntersection={
181+
selectedIdentifierValueCriteria === IdentifierValueCriteria.ALLOW_INTERSECTION
182+
}
170183
onChange={handleFilterChange}
171184
additionalSettings={tableSettings}
172185
areCurrentlySelectedTablesComparable={tableDefinitionsAccessor.getAreTablesComparable()}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { InplaceVolumetricsFilterSettings } from "@framework/types/inplaceVolumetricsFilterSettings";
2+
3+
export type InplaceVolumetricsFilterSelections = Omit<
4+
InplaceVolumetricsFilterSettings,
5+
"allowIdentifierValuesIntersection"
6+
>;

frontend/src/modules/InplaceVolumetricsTable/view/atoms/baseAtoms.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { InplaceVolumetricResultName_api, InplaceVolumetricStatistic_api } from "@api";
2-
import { InplaceVolumetricsFilter } from "@framework/types/inplaceVolumetricsFilter";
2+
import { InplaceVolumetricsFilterSelections } from "@modules/InplaceVolumetricsTable/types";
33
import { SourceAndTableIdentifierUnion, SourceIdentifier, TableType } from "@modules/_shared/InplaceVolumetrics/types";
44

55
import { atom } from "jotai";
66

7-
export const filterAtom = atom<InplaceVolumetricsFilter>({
7+
export const filterAtom = atom<InplaceVolumetricsFilterSelections>({
88
ensembleIdents: [],
99
tableNames: [],
1010
fluidZones: [],

0 commit comments

Comments
 (0)