Skip to content
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

feat(react-components): CoreDM queries #4708

Merged
merged 35 commits into from
Sep 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
2d4785f
feat(react-components): WIP CoreDM queries
haakonflatval-cognite Aug 19, 2024
ed7844f
feat: implement filterNodesByMappedTo3d
haakonflatval-cognite Aug 19, 2024
cffafb7
chore: finish last two requests
haakonflatval-cognite Aug 20, 2024
6b0210a
chore: I'm so sorry
haakonflatval-cognite Aug 21, 2024
4a981b0
chore: add missing files
haakonflatval-cognite Aug 21, 2024
4dca9ea
chore: fix remaining field misname
haakonflatval-cognite Aug 21, 2024
0ca4c71
chore: fix executeParallel
haakonflatval-cognite Aug 22, 2024
7fda23a
chore: correct import path
haakonflatval-cognite Aug 22, 2024
2e74a2c
chore: make sure nodeId-treeIndex queries are chunked
haakonflatval-cognite Aug 22, 2024
9bbaefd
chore: include initialAssetMappingsData in the useSearchMappedAssetMa…
haakonflatval-cognite Aug 22, 2024
93bb349
chore: add executeParallel test
haakonflatval-cognite Aug 22, 2024
e26c1b5
chore: fix scene camera request
haakonflatval-cognite Aug 22, 2024
b7e86be
feat: add flag in RevealContext to enable CoreDM queries
haakonflatval-cognite Aug 22, 2024
54c57cc
fix: fix some datamodels/queries
haakonflatval-cognite Aug 23, 2024
1b95a29
chore: further corrections
haakonflatval-cognite Aug 23, 2024
7a4e0c8
chore: made some more fixes
haakonflatval-cognite Aug 26, 2024
0d8409f
Merge remote-tracking branch 'origin/master' into hflatval/core-dm-qu…
haakonflatval-cognite Aug 26, 2024
9c78c26
fix: more fixes
haakonflatval-cognite Aug 28, 2024
4450164
chore: add missing files
haakonflatval-cognite Aug 28, 2024
a678a60
chore: more polishing and fixing
haakonflatval-cognite Aug 28, 2024
2ab3903
fix: filterNodesByMappedTo3d
haakonflatval-cognite Aug 29, 2024
1de40d7
chore: lint fix
haakonflatval-cognite Aug 29, 2024
691ef01
chore: reuse createFdmKey
haakonflatval-cognite Aug 29, 2024
10d4f07
chore: move utils file back
haakonflatval-cognite Aug 29, 2024
82d95fd
chore: revert unnecessary change
haakonflatval-cognite Aug 29, 2024
353e5a6
chore: retrigger CI
haakonflatval-cognite Sep 2, 2024
d7f7592
Merge branch 'master' into hflatval/core-dm-queries
haakonflatval-cognite Sep 2, 2024
cc9b22c
chore: update format of revision external ID
haakonflatval-cognite Sep 2, 2024
7d6105c
chore: apply changes to file a-posterioris
haakonflatval-cognite Sep 3, 2024
593b33c
chore: create useful warning
haakonflatval-cognite Sep 3, 2024
fe08bee
chore: correct SDK path, factor out constants
haakonflatval-cognite Sep 3, 2024
8f898f2
chore: refactor queries
haakonflatval-cognite Sep 3, 2024
9dfed45
chore: lint fix
haakonflatval-cognite Sep 3, 2024
9c759d1
Merge branch 'master' into hflatval/core-dm-queries
haakonflatval-cognite Sep 3, 2024
b6fb572
chore(react-components): bump to version 0.56.0
haakonflatval-cognite Sep 3, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion react-components/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@cognite/reveal-react-components",
"version": "0.55.10",
"version": "0.56.0",
"exports": {
".": {
"import": "./dist/index.js",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,15 @@ import { chunk } from 'lodash';
import {
type CreateInstanceItem,
type DmsUniqueIdentifier,
type FdmSDK,
type InstanceFilter
type FdmSDK
} from '../../../data-providers/FdmSDK';
import { type ObservationFdmNode, OBSERVATION_SOURCE, type ObservationProperties } from './models';

import { v4 as uuid } from 'uuid';

export async function fetchObservations(fdmSdk: FdmSDK): Promise<ObservationFdmNode[]> {
const observationsFilter: InstanceFilter = {};

const observationResult = await fdmSdk.filterAllInstances<ObservationProperties>(
observationsFilter,
undefined,
danpriori marked this conversation as resolved.
Show resolved Hide resolved
'node',
OBSERVATION_SOURCE
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
type CogniteInternalId
} from '@cognite/sdk';
import {
type ModelNodeIdKey,
type ModelTreeIndexKey,
type AssetId,
type ModelId,
type RevisionId,
Expand Down Expand Up @@ -195,7 +195,7 @@ export class AssetMappingAndNode3DCache {

private async getItemCacheResult(
type: string,
key: ModelNodeIdKey | ModelAssetIdKey
key: ModelTreeIndexKey | ModelAssetIdKey
): Promise<AssetMapping[] | undefined> {
return type === 'nodeIds'
? await this.nodeIdsToAssetMappingCache.getNodeIdsToAssetMappingCacheItem(key)
Expand All @@ -204,7 +204,7 @@ export class AssetMappingAndNode3DCache {

private setItemCacheResult(
type: string,
key: ModelNodeIdKey | ModelAssetIdKey,
key: ModelTreeIndexKey | ModelAssetIdKey,
item: AssetMapping[] | undefined
): void {
const value = Promise.resolve(item ?? []);
Expand Down Expand Up @@ -238,7 +238,7 @@ export class AssetMappingAndNode3DCache {
const keyAssetId: ModelAssetIdKey = modelRevisionNodesAssetsToKey(modelId, revisionId, [
item.assetId
]);
const keyNodeId: ModelNodeIdKey = modelRevisionNodesAssetsToKey(modelId, revisionId, [
const keyNodeId: ModelTreeIndexKey = modelRevisionNodesAssetsToKey(modelId, revisionId, [
item.nodeId
]);
await this.assetIdsToAssetMappingCache.setAssetMappingsCacheItem(keyAssetId, item);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,29 @@
* Copyright 2024 Cognite AS
*/
import { type AssetMapping3D } from '@cognite/sdk/dist/src';
import { type ModelNodeIdKey } from './types';
import { type ModelTreeIndexKey } from './types';
import { type AssetMapping } from './AssetMappingAndNode3DCache';

export class AssetMappingPerNodeIdCache {
private readonly _nodeIdsToAssetMappings = new Map<ModelNodeIdKey, Promise<AssetMapping[]>>();
private readonly _nodeIdsToAssetMappings = new Map<ModelTreeIndexKey, Promise<AssetMapping[]>>();

public setNodeIdsToAssetMappingCacheItem(
key: ModelNodeIdKey,
key: ModelTreeIndexKey,
haakonflatval-cognite marked this conversation as resolved.
Show resolved Hide resolved
item: Promise<Array<Required<AssetMapping3D>>>
): void {
this._nodeIdsToAssetMappings.set(key, Promise.resolve(item));
}

public async getNodeIdsToAssetMappingCacheItem(
key: ModelNodeIdKey
key: ModelTreeIndexKey
): Promise<AssetMapping[] | undefined> {
return await this._nodeIdsToAssetMappings.get(key);
}

public async setAssetMappingsCacheItem(key: ModelNodeIdKey, item: AssetMapping): Promise<void> {
public async setAssetMappingsCacheItem(
key: ModelTreeIndexKey,
item: AssetMapping
): Promise<void> {
const currentAssetMappings = this.getNodeIdsToAssetMappingCacheItem(key);
this.setNodeIdsToAssetMappingCacheItem(
key,
Expand Down
111 changes: 55 additions & 56 deletions react-components/src/components/CacheProvider/FdmNodeCache.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,25 @@ import {
type FdmCadConnection,
type ModelRevisionKey,
type RevisionId,
type NodeId,
type ModelNodeIdKey,
type ModelTreeIndexKey,
type ModelRevisionToConnectionMap,
type ModelRevisionId,
type FdmKey,
type FdmNodeDataPromises
type FdmNodeDataPromises,
type TreeIndex
} from './types';

import {
createFdmKey,
createModelNodeIdKey,
createModelTreeIndexKey,
createModelRevisionKey,
revisionKeyToIds
} from './idAndKeyTranslation';

import { partition } from 'lodash';

import assert from 'assert';
import { fetchNodesForNodeIds, inspectNodes } from './requests';
import { fetchNodesForNodeIds, inspectNodes, treeIndexesToNodeIds } from './requests';
import { type ThreeDModelFdmMappings } from '../../hooks/types';
import { type Fdm3dDataProvider } from '../../data-providers/Fdm3dDataProvider';

Expand Down Expand Up @@ -78,9 +78,7 @@ export class FdmNodeCache {
modelRevisionIds: ModelRevisionId[],
externalIds: DmsUniqueIdentifier[]
): ThreeDModelFdmMappings[] {
const inputExternalIdSet = new Set<FdmKey>(
externalIds.map((id) => createFdmKey(id.space, id.externalId))
);
const inputExternalIdSet = new Set<FdmKey>(externalIds.map(createFdmKey));

return modelRevisionIds.map((modelRevisionId) => {
return this.getCachedModelMappingForRevision(modelRevisionId, inputExternalIdSet);
Expand Down Expand Up @@ -122,7 +120,7 @@ export class FdmNodeCache {
return [];
}

const fdmKeySet = new Set(instances.map((id) => createFdmKey(id.space, id.externalId)));
const fdmKeySet = new Set(instances.map(createFdmKey));

const revisionToConnectionsMap = await this.getAndCacheRevisionToConnectionsMap(
modelRevisions,
Expand Down Expand Up @@ -239,8 +237,8 @@ export class FdmNodeCache {
modelRevisionIds: ModelRevisionId[],
fetchViews: boolean
): Promise<Map<ModelRevisionKey, FdmConnectionWithNode[]>> {
const revisionIds = modelRevisionIds.map((modelRevisionId) => modelRevisionId.revisionId);
const connections = await this._fdm3dDataProvider.getCadConnectionsForRevisions(revisionIds);
const connections =
await this._fdm3dDataProvider.getCadConnectionsForRevisions(modelRevisionIds);

const connectionsWithOptionalViews = fetchViews
? await this.getViewsForConnections(connections)
Expand Down Expand Up @@ -269,15 +267,15 @@ export class FdmNodeCache {

private async getViewsForConnections(
connections: FdmCadConnection[]
): Promise<Array<{ connection: FdmCadConnection; view: Source }>> {
): Promise<Array<{ connection: FdmCadConnection; views: Source[] }>> {
const nodeInspectionResults = await inspectNodes(
this._fdmClient,
connections.map((connection) => connection.instance)
);

const dataWithViews = connections.map((connection, ind) => ({
connection,
view: nodeInspectionResults.items[ind].inspectionResults.involvedViews[0]
views: nodeInspectionResults.items[ind].inspectionResults.involvedViews
}));

return dataWithViews;
Expand Down Expand Up @@ -307,28 +305,28 @@ export class FdmNodeCache {
}

async function createRevisionToConnectionsMap(
connectionsWithView: Array<{ connection: FdmCadConnection; view?: Source }>,
connectionsWithViews: Array<{ connection: FdmCadConnection; views?: Source[] }>,
modelRevisionIds: ModelRevisionId[],
cdfClient: CogniteClient
): Promise<Map<ModelRevisionKey, FdmConnectionWithNode[]>> {
const revisionToNodeIdsMap = createRevisionToNodeIdMap(connectionsWithView);
const modelNodeIdToNodeMap = await createModelNodeIdToNodeMap(
revisionToNodeIdsMap,
const revisionToTreeIndexMap = createRevisionToTreeIndexMap(connectionsWithViews);
const modelTreeIndexToNodeMap = await createModelTreeIndexToNodeMap(
revisionToTreeIndexMap,
modelRevisionIds,
cdfClient
);

return connectionsWithView.reduce((map, connectionWithView) => {
const connectionRevisionId = connectionWithView.connection.revisionId;
return connectionsWithViews.reduce((map, connectionWithViews) => {
const connectionRevisionId = connectionWithViews.connection.revisionId;
const modelRevisionId = modelRevisionIds.find((p) => p.revisionId === connectionRevisionId);

if (modelRevisionId === undefined) return map;

const value = createFdmConnectionWithNode(
modelRevisionId,
modelNodeIdToNodeMap,
connectionWithView.connection,
connectionWithView.view
modelTreeIndexToNodeMap,
connectionWithViews.connection,
connectionWithViews.views
);

insertConnectionIntoMapList(value, map, modelRevisionId);
Expand All @@ -339,20 +337,20 @@ async function createRevisionToConnectionsMap(

function createFdmConnectionWithNode(
modelRevisionId: ModelRevisionId,
modelNodeIdToNodeMap: Map<ModelNodeIdKey, Node3D>,
modelTreeIndexToNodeMap: Map<ModelTreeIndexKey, Node3D>,
connection: FdmCadConnection,
view?: Source
views?: Source[]
danpriori marked this conversation as resolved.
Show resolved Hide resolved
): FdmConnectionWithNode {
const revisionNodeIdKey = createModelNodeIdKey(
const revisionTreeIndexKey = createModelTreeIndexKey(
modelRevisionId.modelId,
modelRevisionId.revisionId,
connection.nodeId
connection.treeIndex
);

const node = modelNodeIdToNodeMap.get(revisionNodeIdKey);
const node = modelTreeIndexToNodeMap.get(revisionTreeIndexKey);
assert(node !== undefined);

return { connection, cadNode: node, view };
return { connection, cadNode: node, views };
}

function insertConnectionIntoMapList(
Expand All @@ -374,56 +372,57 @@ function insertConnectionIntoMapList(
}
}

async function createModelNodeIdToNodeMap(
revisionToNodeIdsMap: Map<RevisionId, NodeId[]>,
async function createModelTreeIndexToNodeMap(
revisionToTreeIndicesMap: Map<RevisionId, TreeIndex[]>,
modelRevisionIds: ModelRevisionId[],
cdfClient: CogniteClient
): Promise<Map<ModelNodeIdKey, Node3D>> {
const revisionNodeIdToNode = new Map<ModelNodeIdKey, Node3D>();
): Promise<Map<ModelTreeIndexKey, Node3D>> {
const revisionTreeIndexToNode = new Map<ModelTreeIndexKey, Node3D>();

const nodePromises = [...revisionToNodeIdsMap.entries()].map(async ([revisionId, nodeIds]) => {
const modelId = modelRevisionIds.find((p) => p.revisionId === revisionId)?.modelId;
assert(modelId !== undefined);
const nodePromises = [...revisionToTreeIndicesMap.entries()].map(
async ([revisionId, treeIndices]) => {
const modelId = modelRevisionIds.find((p) => p.revisionId === revisionId)?.modelId;
assert(modelId !== undefined);

const nodes = await fetchNodesForNodeIds(modelId, revisionId, nodeIds, cdfClient);
nodeIds.forEach((nodeId, ind) => {
const modelNodeIdKey = createModelNodeIdKey(modelId, revisionId, nodeId);
revisionNodeIdToNode.set(modelNodeIdKey, nodes[ind]);
});
});
const nodeIds = await treeIndexesToNodeIds(modelId, revisionId, treeIndices, cdfClient);
const nodes = await fetchNodesForNodeIds(modelId, revisionId, nodeIds, cdfClient);

nodes.forEach((node) => {
const modelTreeIndexKey = createModelTreeIndexKey(modelId, revisionId, node.treeIndex);
revisionTreeIndexToNode.set(modelTreeIndexKey, node);
});
}
);

await Promise.all(nodePromises);

return revisionNodeIdToNode;
return revisionTreeIndexToNode;
}

function createRevisionToNodeIdMap(
function createRevisionToTreeIndexMap(
connections: Array<{ connection: FdmCadConnection; view?: Source }>
): Map<RevisionId, NodeId[]> {
return connections.reduce((revisionNodeIdMap, connectionWithView) => {
const { nodeId, revisionId } = connectionWithView.connection;
): Map<RevisionId, TreeIndex[]> {
return connections.reduce((revisionTreeIndexMap, connectionWithView) => {
const { treeIndex, revisionId } = connectionWithView.connection;

const nodeIdsInRevision = revisionNodeIdMap.get(revisionId);
const treeIndicesInRevision = revisionTreeIndexMap.get(revisionId);

if (nodeIdsInRevision !== undefined) {
nodeIdsInRevision.push(nodeId);
if (treeIndicesInRevision !== undefined) {
treeIndicesInRevision.push(treeIndex);
} else {
revisionNodeIdMap.set(revisionId, [nodeId]);
revisionTreeIndexMap.set(revisionId, [treeIndex]);
}

return revisionNodeIdMap;
}, new Map<RevisionId, NodeId[]>());
return revisionTreeIndexMap;
}, new Map<RevisionId, TreeIndex[]>());
}

function intersectWithFdmKeySet(
connections: FdmConnectionWithNode[],
relevantFdmKeySet: Set<FdmKey>
): FdmConnectionWithNode[] {
return connections.filter((connectionData) => {
const fdmKey = createFdmKey(
connectionData.connection.instance.space,
connectionData.connection.instance.externalId
);
const fdmKey = createFdmKey(connectionData.connection.instance);
return relevantFdmKeySet.has(fdmKey);
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ import {
type ChunkInCacheTypes,
type ModelId,
type RevisionId,
type ModelNodeIdKey
type ModelTreeIndexKey
} from './types';
import { modelRevisionNodesAssetsToKey } from './utils';
import { fetchNodesForNodeIds } from './requests';

export class Node3DPerNodeIdCache {
private readonly _sdk: CogniteClient;

private readonly _nodeIdsToNode3D = new Map<ModelNodeIdKey, Promise<Node3D>>();
private readonly _nodeIdsToNode3D = new Map<ModelTreeIndexKey, Promise<Node3D>>();

constructor(sdk: CogniteClient) {
this._sdk = sdk;
Expand Down Expand Up @@ -71,11 +71,11 @@ export class Node3DPerNodeIdCache {
return allNodes;
}

public async getNodeIdToNode3DCacheItem(key: ModelNodeIdKey): Promise<Node3D | undefined> {
public async getNodeIdToNode3DCacheItem(key: ModelTreeIndexKey): Promise<Node3D | undefined> {
return await this._nodeIdsToNode3D.get(key);
}

public setNodeIdToNode3DCacheItem(key: ModelNodeIdKey, item: Promise<Node3D>): void {
public setNodeIdToNode3DCacheItem(key: ModelTreeIndexKey, item: Promise<Node3D>): void {
this._nodeIdsToNode3D.set(key, Promise.resolve(item));
}
}
Loading
Loading