Skip to content

Commit

Permalink
refactor: activity queries (#184)
Browse files Browse the repository at this point in the history
refactor activity queries

* Consolidate activity subscription transformation into single function
* Rename activity start_time to start_time_doy for clarity
* Remove obsolete transform functions
* Order activities and simulation datasets by start_offset ascending
* Add uniqueId field to Activity type
  • Loading branch information
camargo authored Oct 13, 2022
1 parent b731615 commit d7b087f
Show file tree
Hide file tree
Showing 9 changed files with 146 additions and 174 deletions.
21 changes: 14 additions & 7 deletions src/components/activity/ActivityDecomposition.svelte.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,11 @@ const activities: Activity[] = [
simulated_activity_id: 29,
simulation_dataset_id: 6,
source_scheduling_goal_id: null,
start_time: '2022-062T10:00:00.000',
start_time_doy: '2022-062T10:00:00.000',
tags: [],
type: 'parent',
unfinished: false,
uniqueId: 'directive_12',
},
{
arguments: {},
Expand All @@ -46,10 +47,11 @@ const activities: Activity[] = [
simulated_activity_id: 68,
simulation_dataset_id: 21,
source_scheduling_goal_id: null,
start_time: '2020-129T03:38:49.856',
start_time_doy: '2020-129T03:38:49.856',
tags: [],
type: 'grandchild1',
unfinished: false,
uniqueId: 'simulated_68',
},
{
arguments: {},
Expand All @@ -70,10 +72,11 @@ const activities: Activity[] = [
simulated_activity_id: 69,
simulation_dataset_id: 21,
source_scheduling_goal_id: null,
start_time: '2020-072T03:38:49.856',
start_time_doy: '2020-072T03:38:49.856',
tags: [],
type: 'grandchild2',
unfinished: false,
uniqueId: 'simulated_69',
},
{
arguments: {},
Expand All @@ -94,10 +97,11 @@ const activities: Activity[] = [
simulated_activity_id: 70,
simulation_dataset_id: 21,
source_scheduling_goal_id: null,
start_time: '2020-072T03:38:49.856',
start_time_doy: '2020-072T03:38:49.856',
tags: [],
type: 'child1',
unfinished: false,
uniqueId: 'simulated_70',
},
{
arguments: {},
Expand All @@ -118,10 +122,11 @@ const activities: Activity[] = [
simulated_activity_id: 71,
simulation_dataset_id: 21,
source_scheduling_goal_id: null,
start_time: '2020-093T03:38:49.856',
start_time_doy: '2020-093T03:38:49.856',
tags: [],
type: 'grandchild3',
unfinished: false,
uniqueId: 'simulated_71',
},
{
arguments: {},
Expand All @@ -142,10 +147,11 @@ const activities: Activity[] = [
simulated_activity_id: 72,
simulation_dataset_id: 21,
source_scheduling_goal_id: null,
start_time: '2020-129T03:38:49.856',
start_time_doy: '2020-129T03:38:49.856',
tags: [],
type: 'child2',
unfinished: false,
uniqueId: 'simulated_72',
},
{
arguments: {},
Expand All @@ -166,10 +172,11 @@ const activities: Activity[] = [
simulated_activity_id: 73,
simulation_dataset_id: 21,
source_scheduling_goal_id: null,
start_time: '2020-150T03:38:49.856',
start_time_doy: '2020-150T03:38:49.856',
tags: [],
type: 'grandchild4',
unfinished: false,
uniqueId: 'simulated_73',
},
];

Expand Down
18 changes: 9 additions & 9 deletions src/components/activity/ActivityFormPanel.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
let seq_id: string | null = null;
let simulated_activity_id: number | null = null;
let sourceSchedulingGoalId: number | null = null;
let startTime: string | null = null;
let startTimeDoy: string | null = null;
let tags: string[] = [];
let type: string | null = null;
let unfinished: boolean | null = null;
Expand All @@ -63,7 +63,7 @@
let parametersWithErrorsCount: number = 0;
let parameterErrorMap: Record<string, string[]> = {};
let rootActivityHasChildren: boolean;
let startTimeField: FieldStore<string>;
let startTimeDoyField: FieldStore<string>;
$: if ($selectedActivity) {
activityName = $selectedActivity.name;
Expand All @@ -77,7 +77,7 @@
root_activity = getActivityRootParent($activitiesMap, id);
simulated_activity_id = $selectedActivity.simulated_activity_id;
sourceSchedulingGoalId = $selectedActivity.source_scheduling_goal_id;
startTime = $selectedActivity.start_time;
startTimeDoy = $selectedActivity.start_time_doy;
tags = $selectedActivity.tags;
type = $selectedActivity.type;
unfinished = $selectedActivity.unfinished;
Expand All @@ -96,7 +96,7 @@
seq_id = null;
simulated_activity_id = null;
sourceSchedulingGoalId = null;
startTime = null;
startTimeDoy = null;
type = null;
unfinished = null;
tags = [];
Expand All @@ -115,10 +115,10 @@
$: activityType = $activityTypesMap[type] || null;
$: rootActivityHasChildren = root_activity?.child_ids ? root_activity.child_ids.length > 0 : false;
$: isChild = parent_id !== null;
$: startTimeField = field<string>(startTime, [required, timestamp]);
$: startTimeDoyField = field<string>(startTimeDoy, [required, timestamp]);
$: activityNameField = field<string>(activityName);
$: if (duration) {
const startTimeISO = new Date(getUnixEpochTime(startTime)).toISOString();
const startTimeISO = new Date(getUnixEpochTime(startTimeDoy)).toISOString();
endTime = `${getDoyTimeFromDuration(startTimeISO, duration)}`;
} else {
endTime = null;
Expand Down Expand Up @@ -204,8 +204,8 @@
}
function onUpdateStartTime() {
if ($startTimeField.valid && startTime !== $startTimeField.value) {
effects.updateActivityDirective(id, { start_time: $startTimeField.value });
if ($startTimeDoyField.valid && startTimeDoy !== $startTimeDoyField.value) {
effects.updateActivityDirective(id, { start_time_doy: $startTimeDoyField.value });
}
}
Expand Down Expand Up @@ -375,7 +375,7 @@

<DatePickerField
disabled={isChild}
field={startTimeField}
field={startTimeDoyField}
label="Start Time - YYYY-DDDThh:mm:ss"
layout="inline"
name="start-time"
Expand Down
4 changes: 2 additions & 2 deletions src/components/activity/ActivityTablePanel.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@
resizable: true,
sortable: true,
},
start_time: {
start_time_doy: {
field: 'start_time',
filter: 'text',
headerName: 'Start Time',
Expand All @@ -103,7 +103,7 @@
hide: true,
resizable: true,
sortable: true,
}, //string[];
},
type: {
field: 'type',
filter: 'text',
Expand Down
8 changes: 4 additions & 4 deletions src/components/timeline/LayerActivity.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,9 @@
if (dragOffsetX && dragPoint) {
const x = offsetX - dragOffsetX;
const unixEpochTime = xScaleView.invert(x).getTime();
const start_time = getDoyTime(new Date(unixEpochTime));
const start_time_doy = getDoyTime(new Date(unixEpochTime));
if (unixEpochTime !== dragPoint.x) {
effects.updateActivityDirective(dragPoint.id, { start_time }, false);
effects.updateActivityDirective(dragPoint.id, { start_time_doy }, false);
}
}
}
Expand All @@ -109,9 +109,9 @@
if (dragOffsetX && dragPoint) {
const x = offsetX - dragOffsetX;
const unixEpochTime = xScaleView.invert(x).getTime();
const start_time = getDoyTime(new Date(unixEpochTime));
const start_time_doy = getDoyTime(new Date(unixEpochTime));
if (unixEpochTime !== dragPoint.x) {
effects.updateActivityDirective(dragPoint.id, { start_time });
effects.updateActivityDirective(dragPoint.id, { start_time_doy });
}
dragOffsetX = null;
dragPoint = null;
Expand Down
110 changes: 86 additions & 24 deletions src/stores/activities.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,8 @@
import { keyBy } from 'lodash-es';
import { derived, writable, type Readable, type Writable } from 'svelte/store';
import {
activitiesToPoints,
activityDirectiveToActivity,
activitySimulatedToActivity,
getChildIdsFn,
getParentIdFn,
} from '../utilities/activities';
import { derived, get, writable, type Readable, type Writable } from 'svelte/store';
import { activitiesToPoints } from '../utilities/activities';
import gql from '../utilities/gql';
import { planId } from './plan';
import { getDoyTimeFromDuration } from '../utilities/time';
import { plan, planId } from './plan';
import { simulationDatasetId } from './simulation';
import { gqlSubscribable } from './subscribable';

Expand All @@ -19,23 +13,91 @@ export const activitiesMap = gqlSubscribable<ActivitiesMap>(
{ planId, simulationDatasetId },
{},
(data: SubActivitiesResponse) => {
const { activity_directives, simulations, start_time } = data;
const { start_time: plan_start_time } = get<Plan>(plan);
const { activity_directives, simulations } = data;
const [{ simulation_datasets } = { simulation_datasets: [] }] = simulations;
const [{ simulated_activities } = { simulated_activities: [] }] = simulation_datasets;

const getParentId = getParentIdFn(activity_directives);
const getChildIds = getChildIdsFn(simulated_activities);

const newActivities: Activity[] = [
...activity_directives.map((activityDirective: ActivityDirective) =>
activityDirectiveToActivity(start_time, activityDirective, getChildIds),
),
...simulated_activities.map((activitySimulated: ActivitySimulated) =>
activitySimulatedToActivity(start_time, activitySimulated, getChildIds, getParentId),
),
];

return keyBy(newActivities, 'id');
// For each directive, map each simulated activity to it's directive activity id.
const simulatedIdToDirectiveId = activity_directives.reduce(
(map: Record<ActivitySimulatedId, ActivityDirectiveId>, activityDirective: ActivityDirective) => {
const { simulated_activities } = activityDirective;
const activitySimulated = simulated_activities[0];

if (activitySimulated) {
map[activitySimulated.id] = activityDirective.id;
}

return map;
},
{},
);

// Map each simulated activity id to it's list of simulated activity child ids.
const parentIdToChildIds = simulated_activities.reduce(
(map: Record<ActivitySimulatedId, ActivitySimulatedId[]>, activitySimulated: ActivitySimulated) => {
if (map[activitySimulated.parent_id] === undefined) {
map[activitySimulated.parent_id] = [activitySimulated.id];
} else {
map[activitySimulated.parent_id].push(activitySimulated.id);
}
return map;
},
{},
);

const activitiesMap: ActivitiesMap = {};

for (const activityDirective of activity_directives) {
const { simulated_activities } = activityDirective;
const activitySimulated = simulated_activities[0];

activitiesMap[activityDirective.id] = {
arguments: activityDirective.arguments,
attributes: activitySimulated?.attributes ?? null,
child_ids: parentIdToChildIds[activitySimulated?.id] ?? [],
created_at: activityDirective.created_at,
duration: activitySimulated?.duration ?? null,
id: activityDirective.id,
last_modified_at: activityDirective.last_modified_at,
metadata: activityDirective.metadata,
name: activityDirective.name,
parent_id: null,
simulated_activity_id: activitySimulated?.id ?? null,
simulation_dataset_id: activitySimulated?.simulation_dataset_id ?? null,
source_scheduling_goal_id: activityDirective.source_scheduling_goal_id,
start_time_doy: getDoyTimeFromDuration(plan_start_time, activityDirective.start_offset),
tags: activityDirective.tags,
type: activityDirective.type,
unfinished: activitySimulated?.duration === null,
uniqueId: `directive_${activityDirective.id}`,
};
}

for (const activitySimulated of simulated_activities) {
activitiesMap[activitySimulated.id] = {
arguments: {},
attributes: activitySimulated.attributes,
child_ids: parentIdToChildIds[activitySimulated.id] ?? [],
created_at: '',
duration: activitySimulated.duration,
id: activitySimulated.id,
last_modified_at: '',
metadata: {},
name: '',
parent_id: simulatedIdToDirectiveId[activitySimulated.parent_id] ?? activitySimulated.parent_id,
simulated_activity_id: activitySimulated.id,
simulation_dataset_id: activitySimulated.simulation_dataset_id,
source_scheduling_goal_id: null,
start_time_doy: getDoyTimeFromDuration(plan_start_time, activitySimulated.start_offset),
tags: [],
type: activitySimulated.activity_type_name,
unfinished: activitySimulated.duration === null,
uniqueId: `simulated_${activitySimulated.id}`,
};
}

return activitiesMap;
},
);

Expand Down
6 changes: 4 additions & 2 deletions src/types/activity.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,11 @@ type Activity = {
simulated_activity_id: ActivitySimulatedId | null;
simulation_dataset_id: number | null;
source_scheduling_goal_id: number;
start_time: string;
start_time_doy: string;
tags: string[];
type: string;
unfinished: boolean;
uniqueId: string;
};

type ActivitiesMap = Record<ActivityId, Activity>;
Expand All @@ -44,9 +45,11 @@ type ActivityDirective = {
arguments: ArgumentsMap;
created_at: string;
id: ActivityDirectiveId;
last_modified_arguments_at: string;
last_modified_at: string;
metadata: ActivityMetadata;
name: string;
plan_id: number;
simulated_activities: [ActivitySimulated];
source_scheduling_goal_id: number;
start_offset: string;
Expand Down Expand Up @@ -84,5 +87,4 @@ type ActivitySimulated = {
type SubActivitiesResponse = {
activity_directives: ActivityDirective[];
simulations: [{ simulation_datasets: [{ simulated_activities: ActivitySimulated[] }] }];
start_time: string;
};
Loading

0 comments on commit d7b087f

Please sign in to comment.