[Flexible Schema] Create indexes for join columns (#6165)
## Context
We want to add an index on our foreign keys since PG does not do it for
us. An index can sometimes be expensive and not always meaningful
depending on different usages but in our case we decided to apply an
index for every foreign keys.
```typescript
@WorkspaceIndex()
@WorkspaceJoinColumn('author')
authorId: string;
```
This syntax is valid but since we want to apply it to every join column
I've decided to update the code of WorkspaceJoinColumn so it properly
registers a new index at the same time which is less error-prone.
Note: We had a bug on index name generation since postgres index names
are unique per schema and not table, the object metadata id (hashed) has
been added to the formula that generates the name of the index
## Test
Sync metadata. We have 45 join columns as of today per workspace, we
should see 45 rows inside IndexMetadata table
This commit is contained in:
@ -1,5 +1,6 @@
|
||||
import { generateDeterministicIndexName } from 'src/engine/metadata-modules/index-metadata/utils/generate-deterministic-index-name';
|
||||
import { metadataArgsStorage } from 'src/engine/twenty-orm/storage/metadata-args.storage';
|
||||
import { convertClassNameToObjectMetadataName } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/convert-class-to-object-metadata-name.util';
|
||||
|
||||
export interface WorkspaceIndexOptions {
|
||||
columns?: string[];
|
||||
@ -16,11 +17,13 @@ export function WorkspaceIndex(
|
||||
}
|
||||
|
||||
// TODO: handle composite field metadata types
|
||||
// TODO: handle relation field metadata types
|
||||
|
||||
if (Array.isArray(columns) && columns.length > 0) {
|
||||
metadataArgsStorage.addIndexes({
|
||||
name: `IDX_${generateDeterministicIndexName(columns)}`,
|
||||
name: `IDX_${generateDeterministicIndexName([
|
||||
convertClassNameToObjectMetadataName(target.name),
|
||||
...columns,
|
||||
])}`,
|
||||
columns,
|
||||
target: target,
|
||||
});
|
||||
@ -29,7 +32,10 @@ export function WorkspaceIndex(
|
||||
}
|
||||
|
||||
metadataArgsStorage.addIndexes({
|
||||
name: `IDX_${generateDeterministicIndexName([propertyKey.toString()])}`,
|
||||
name: `IDX_${generateDeterministicIndexName([
|
||||
convertClassNameToObjectMetadataName(target.constructor.name),
|
||||
propertyKey.toString(),
|
||||
])}`,
|
||||
columns: [propertyKey.toString()],
|
||||
target: target.constructor,
|
||||
});
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
import { WorkspaceIndex } from 'src/engine/twenty-orm/decorators/workspace-index.decorator';
|
||||
import { metadataArgsStorage } from 'src/engine/twenty-orm/storage/metadata-args.storage';
|
||||
|
||||
export function WorkspaceJoinColumn(
|
||||
@ -9,5 +10,8 @@ export function WorkspaceJoinColumn(
|
||||
relationName: relationPropertyKey,
|
||||
joinColumn: propertyKey.toString(),
|
||||
});
|
||||
|
||||
// Register index for join column
|
||||
WorkspaceIndex()(object, propertyKey);
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user