chore(index): index dml (#10482)
What: - DML - `autoincrement` property - Index `type` option (GIN) - Index module - DML
This commit is contained in:
committed by
GitHub
parent
096f1c2a9b
commit
69f4c4f4e0
@@ -0,0 +1,20 @@
|
||||
import { expectTypeOf } from "expect-type"
|
||||
import { AutoIncrementProperty } from "../properties/autoincrement"
|
||||
|
||||
describe("Autoincrement property", () => {
|
||||
test("create autoincrement property type", () => {
|
||||
const property = new AutoIncrementProperty()
|
||||
|
||||
expectTypeOf(property["$dataType"]).toEqualTypeOf<number>()
|
||||
expect(property.parse("display_id")).toEqual({
|
||||
fieldName: "display_id",
|
||||
dataType: {
|
||||
name: "serial",
|
||||
options: {},
|
||||
},
|
||||
nullable: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -3736,6 +3736,7 @@ describe("Entity builder", () => {
|
||||
},
|
||||
group: {
|
||||
entity: "Group",
|
||||
fieldName: "group_id",
|
||||
name: "group",
|
||||
nullable: false,
|
||||
persist: false,
|
||||
@@ -4355,6 +4356,7 @@ describe("Entity builder", () => {
|
||||
},
|
||||
user: {
|
||||
entity: "User",
|
||||
fieldName: "user_id",
|
||||
name: "user",
|
||||
nullable: false,
|
||||
persist: false,
|
||||
@@ -4363,8 +4365,8 @@ describe("Entity builder", () => {
|
||||
user_id: {
|
||||
columnType: "text",
|
||||
entity: "User",
|
||||
fieldName: "user_id",
|
||||
mapToPk: true,
|
||||
fieldName: "user_id",
|
||||
name: "user_id",
|
||||
nullable: false,
|
||||
onDelete: "cascade",
|
||||
@@ -4949,6 +4951,7 @@ describe("Entity builder", () => {
|
||||
name: "user",
|
||||
reference: "m:1",
|
||||
entity: "User",
|
||||
fieldName: "user_id",
|
||||
persist: false,
|
||||
nullable: false,
|
||||
},
|
||||
@@ -5136,6 +5139,7 @@ describe("Entity builder", () => {
|
||||
user: {
|
||||
name: "user",
|
||||
reference: "m:1",
|
||||
fieldName: "user_id",
|
||||
entity: "User",
|
||||
persist: false,
|
||||
nullable: true,
|
||||
@@ -5697,6 +5701,7 @@ describe("Entity builder", () => {
|
||||
},
|
||||
parent: {
|
||||
name: "parent",
|
||||
fieldName: "parent_id",
|
||||
reference: "m:1",
|
||||
entity: "User",
|
||||
persist: false,
|
||||
@@ -7447,39 +7452,37 @@ describe("Entity builder", () => {
|
||||
},
|
||||
user_id: {
|
||||
name: "user_id",
|
||||
reference: "m:1",
|
||||
entity: "User",
|
||||
reference: "scalar",
|
||||
columnType: "text",
|
||||
mapToPk: true,
|
||||
fieldName: "user_id",
|
||||
getter: false,
|
||||
setter: false,
|
||||
nullable: false,
|
||||
type: "User",
|
||||
},
|
||||
user: {
|
||||
reference: "scalar",
|
||||
type: "User",
|
||||
reference: "m:1",
|
||||
entity: "User",
|
||||
persist: false,
|
||||
nullable: false,
|
||||
name: "user",
|
||||
getter: false,
|
||||
setter: false,
|
||||
},
|
||||
team_id: {
|
||||
name: "team_id",
|
||||
reference: "m:1",
|
||||
entity: "Team",
|
||||
reference: "scalar",
|
||||
columnType: "text",
|
||||
mapToPk: true,
|
||||
fieldName: "team_id",
|
||||
nullable: false,
|
||||
getter: false,
|
||||
setter: false,
|
||||
type: "Team",
|
||||
},
|
||||
team: {
|
||||
reference: "scalar",
|
||||
type: "Team",
|
||||
reference: "m:1",
|
||||
entity: "Team",
|
||||
persist: false,
|
||||
nullable: false,
|
||||
name: "team",
|
||||
getter: false,
|
||||
setter: false,
|
||||
},
|
||||
created_at: {
|
||||
reference: "scalar",
|
||||
|
||||
@@ -13,6 +13,7 @@ import {
|
||||
DMLSchemaDefaults,
|
||||
} from "./helpers/entity-builder/create-default-properties"
|
||||
import { ArrayProperty } from "./properties/array"
|
||||
import { AutoIncrementProperty } from "./properties/autoincrement"
|
||||
import { BigNumberProperty } from "./properties/big-number"
|
||||
import { BooleanProperty } from "./properties/boolean"
|
||||
import { DateTimeProperty } from "./properties/date-time"
|
||||
@@ -24,8 +25,8 @@ import { TextProperty } from "./properties/text"
|
||||
import { BelongsTo } from "./relations/belongs-to"
|
||||
import { HasMany } from "./relations/has-many"
|
||||
import { HasOne } from "./relations/has-one"
|
||||
import { ManyToMany } from "./relations/many-to-many"
|
||||
import { HasOneWithForeignKey } from "./relations/has-one-fk"
|
||||
import { ManyToMany } from "./relations/many-to-many"
|
||||
|
||||
/**
|
||||
* The implicit properties added by EntityBuilder in every schema
|
||||
@@ -60,11 +61,11 @@ export type ManyToManyOptions = RelationshipOptions &
|
||||
/**
|
||||
* The column name in the pivot table that for the current entity
|
||||
*/
|
||||
joinColumn?: string
|
||||
joinColumn?: string | string[]
|
||||
/**
|
||||
* The column name in the pivot table for the opposite entity
|
||||
*/
|
||||
inverseJoinColumn?: string
|
||||
inverseJoinColumn?: string | string[]
|
||||
}
|
||||
| {
|
||||
/**
|
||||
@@ -77,6 +78,14 @@ export type ManyToManyOptions = RelationshipOptions &
|
||||
* database for this relationship.
|
||||
*/
|
||||
pivotEntity?: () => DmlEntity<any, any>
|
||||
/**
|
||||
* The column name in the pivot table that for the current entity
|
||||
*/
|
||||
joinColumn?: string | string[]
|
||||
/**
|
||||
* The column name in the pivot table for the opposite entity
|
||||
*/
|
||||
inverseJoinColumn?: string | string[]
|
||||
}
|
||||
)
|
||||
|
||||
@@ -240,6 +249,26 @@ export class EntityBuilder {
|
||||
return new BigNumberProperty()
|
||||
}
|
||||
|
||||
/**
|
||||
* This method defines an autoincrement property.
|
||||
*
|
||||
* @example
|
||||
* import { model } from "@medusajs/framework/utils"
|
||||
*
|
||||
* const MyCustom = model.define("my_custom", {
|
||||
* serial_id: model.autoincrement(),
|
||||
* // ...
|
||||
* })
|
||||
*
|
||||
* export default MyCustom
|
||||
*
|
||||
* @customNamespace Property
|
||||
*/
|
||||
|
||||
autoincrement() {
|
||||
return new AutoIncrementProperty()
|
||||
}
|
||||
|
||||
/**
|
||||
* This method defines an array of strings property.
|
||||
*
|
||||
|
||||
@@ -4,8 +4,6 @@ import {
|
||||
PropertyMetadata,
|
||||
PropertyType,
|
||||
} from "@medusajs/types"
|
||||
import { MikroOrmBigNumberProperty } from "../../../dal"
|
||||
import { generateEntityId, isDefined } from "../../../common"
|
||||
import {
|
||||
ArrayType,
|
||||
BeforeCreate,
|
||||
@@ -14,7 +12,10 @@ import {
|
||||
PrimaryKey,
|
||||
Property,
|
||||
Utils,
|
||||
t as mikroOrmType,
|
||||
} from "@mikro-orm/core"
|
||||
import { generateEntityId, isDefined } from "../../../common"
|
||||
import { MikroOrmBigNumberProperty } from "../../../dal"
|
||||
import { PrimaryKeyModifier } from "../../properties/primary-key"
|
||||
import { applyEntityIndexes } from "../mikro-orm/apply-indexes"
|
||||
|
||||
@@ -32,6 +33,7 @@ const COLUMN_TYPES: {
|
||||
dateTime: "timestamptz",
|
||||
number: "integer",
|
||||
bigNumber: "numeric",
|
||||
serial: "number",
|
||||
text: "text",
|
||||
json: "jsonb",
|
||||
array: "array",
|
||||
@@ -51,6 +53,7 @@ const PROPERTY_TYPES: {
|
||||
dateTime: "date",
|
||||
number: "number",
|
||||
bigNumber: "number",
|
||||
serial: "number",
|
||||
text: "string",
|
||||
json: "any",
|
||||
array: "string[]",
|
||||
@@ -202,19 +205,16 @@ export function defineProperty(
|
||||
* Defining an id property
|
||||
*/
|
||||
if (field.dataType.name === "id") {
|
||||
const IdDecorator = PrimaryKeyModifier.isPrimaryKeyModifier(property)
|
||||
? PrimaryKey({
|
||||
columnType: "text",
|
||||
type: "string",
|
||||
nullable: false,
|
||||
fieldName: field.fieldName,
|
||||
})
|
||||
: Property({
|
||||
columnType: "text",
|
||||
type: "string",
|
||||
nullable: false,
|
||||
fieldName: field.fieldName,
|
||||
})
|
||||
const Prop = PrimaryKeyModifier.isPrimaryKeyModifier(property)
|
||||
? PrimaryKey
|
||||
: Property
|
||||
|
||||
const IdDecorator = Prop({
|
||||
columnType: "text",
|
||||
type: "string",
|
||||
nullable: false,
|
||||
fieldName: field.fieldName,
|
||||
})
|
||||
|
||||
IdDecorator(MikroORMEntity.prototype, field.fieldName)
|
||||
|
||||
@@ -259,6 +259,24 @@ export function defineProperty(
|
||||
return
|
||||
}
|
||||
|
||||
/**
|
||||
* Handling serial property separately to set the column type
|
||||
*/
|
||||
if (field.dataType.name === "serial") {
|
||||
const Prop = PrimaryKeyModifier.isPrimaryKeyModifier(property)
|
||||
? PrimaryKey
|
||||
: Property
|
||||
|
||||
Prop({
|
||||
columnType: "serial",
|
||||
type: mikroOrmType.integer,
|
||||
nullable: true,
|
||||
fieldName: field.fieldName,
|
||||
serializer: Number,
|
||||
})(MikroORMEntity.prototype, field.fieldName)
|
||||
return
|
||||
}
|
||||
|
||||
/**
|
||||
* Define rest of properties
|
||||
*/
|
||||
|
||||
@@ -21,10 +21,10 @@ import { camelToSnakeCase, pluralize } from "../../../common"
|
||||
import { DmlEntity } from "../../entity"
|
||||
import { HasMany } from "../../relations/has-many"
|
||||
import { HasOne } from "../../relations/has-one"
|
||||
import { HasOneWithForeignKey } from "../../relations/has-one-fk"
|
||||
import { ManyToMany as DmlManyToMany } from "../../relations/many-to-many"
|
||||
import { applyEntityIndexes } from "../mikro-orm/apply-indexes"
|
||||
import { parseEntityName } from "./parse-entity-name"
|
||||
import { HasOneWithForeignKey } from "../../relations/has-one-fk"
|
||||
|
||||
type Context = {
|
||||
MANY_TO_MANY_TRACKED_RELATIONS: Record<string, boolean>
|
||||
@@ -329,25 +329,32 @@ export function defineBelongsToRelationship(
|
||||
) {
|
||||
const foreignKeyName = camelToSnakeCase(`${relationship.name}Id`)
|
||||
|
||||
ManyToOne({
|
||||
entity: relatedModelName,
|
||||
columnType: "text",
|
||||
mapToPk: true,
|
||||
fieldName: foreignKeyName,
|
||||
nullable: relationship.nullable,
|
||||
onDelete: shouldCascade ? "cascade" : undefined,
|
||||
})(MikroORMEntity.prototype, foreignKeyName)
|
||||
|
||||
if (DmlManyToMany.isManyToMany(otherSideRelation)) {
|
||||
Property({
|
||||
type: relatedModelName,
|
||||
persist: false,
|
||||
columnType: "text",
|
||||
fieldName: foreignKeyName,
|
||||
nullable: relationship.nullable,
|
||||
})(MikroORMEntity.prototype, relationship.name)
|
||||
} else {
|
||||
// HasMany case
|
||||
})(MikroORMEntity.prototype, foreignKeyName)
|
||||
|
||||
ManyToOne({
|
||||
entity: relatedModelName,
|
||||
nullable: relationship.nullable,
|
||||
persist: false,
|
||||
})(MikroORMEntity.prototype, relationship.name)
|
||||
} else {
|
||||
ManyToOne({
|
||||
entity: relatedModelName,
|
||||
columnType: "text",
|
||||
mapToPk: true,
|
||||
fieldName: foreignKeyName,
|
||||
nullable: relationship.nullable,
|
||||
onDelete: shouldCascade ? "cascade" : undefined,
|
||||
})(MikroORMEntity.prototype, foreignKeyName)
|
||||
|
||||
ManyToOne({
|
||||
entity: relatedModelName,
|
||||
fieldName: foreignKeyName,
|
||||
persist: false,
|
||||
nullable: relationship.nullable,
|
||||
})(MikroORMEntity.prototype, relationship.name)
|
||||
@@ -446,9 +453,30 @@ export function defineManyToManyRelationship(
|
||||
let inversedBy: undefined | string
|
||||
let pivotEntityName: undefined | string
|
||||
let pivotTableName: undefined | string
|
||||
let joinColumn: undefined | string = relationship.options.joinColumn
|
||||
let inverseJoinColumn: undefined | string =
|
||||
|
||||
const joinColumn: undefined | string = !Array.isArray(
|
||||
relationship.options.joinColumn
|
||||
)
|
||||
? relationship.options.joinColumn
|
||||
: undefined
|
||||
|
||||
const joinColumns: undefined | string[] = Array.isArray(
|
||||
relationship.options.joinColumn
|
||||
)
|
||||
? relationship.options.joinColumn
|
||||
: undefined
|
||||
|
||||
const inverseJoinColumn: undefined | string = !Array.isArray(
|
||||
relationship.options.inverseJoinColumn
|
||||
)
|
||||
? relationship.options.inverseJoinColumn
|
||||
: undefined
|
||||
|
||||
const inverseJoinColumns: undefined | string[] = Array.isArray(
|
||||
relationship.options.inverseJoinColumn
|
||||
)
|
||||
? relationship.options.inverseJoinColumn
|
||||
: undefined
|
||||
|
||||
const [otherSideRelationshipProperty, otherSideRelationship] =
|
||||
retrieveOtherSideRelationshipManyToMany({
|
||||
@@ -540,7 +568,9 @@ export function defineManyToManyRelationship(
|
||||
|
||||
const configuresRelationship = !!(
|
||||
joinColumn ||
|
||||
joinColumns ||
|
||||
inverseJoinColumn ||
|
||||
inverseJoinColumns ||
|
||||
relationship.options.pivotTable
|
||||
)
|
||||
const relatedOneConfiguresRelationship = !!(
|
||||
@@ -586,7 +616,16 @@ export function defineManyToManyRelationship(
|
||||
const mappedByPropValue =
|
||||
mappedBy ?? inversedBy ?? otherSideRelationshipProperty
|
||||
|
||||
ManyToMany({
|
||||
const joinColumnProp = Array.isArray(relationship.options.joinColumn)
|
||||
? "joinColumns"
|
||||
: "joinColumn"
|
||||
const inverseJoinColumnProp = Array.isArray(
|
||||
relationship.options.inverseJoinColumn
|
||||
)
|
||||
? "inverseJoinColumns"
|
||||
: "inverseJoinColumn"
|
||||
|
||||
const manytoManyOptions = {
|
||||
owner: isOwner,
|
||||
entity: relatedModelName,
|
||||
...(pivotTableName
|
||||
@@ -598,9 +637,11 @@ export function defineManyToManyRelationship(
|
||||
: {}),
|
||||
...(pivotEntityName ? { pivotEntity: pivotEntityName } : {}),
|
||||
...({ [mappedByProp]: mappedByPropValue } as any),
|
||||
...(joinColumn ? { joinColumn } : {}),
|
||||
...(inverseJoinColumn ? { inverseJoinColumn } : {}),
|
||||
})(MikroORMEntity.prototype, relationship.name)
|
||||
[joinColumnProp]: joinColumn ?? joinColumns,
|
||||
[inverseJoinColumnProp]: inverseJoinColumn ?? inverseJoinColumns,
|
||||
}
|
||||
|
||||
ManyToMany(manytoManyOptions)(MikroORMEntity.prototype, relationship.name)
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -48,6 +48,7 @@ export function applyEntityIndexes(
|
||||
columns: index.on as string[],
|
||||
unique: index.unique,
|
||||
where: index.where,
|
||||
type: index.type,
|
||||
})
|
||||
|
||||
entityIndexStatement.MikroORMIndex()(MikroORMEntity)
|
||||
|
||||
41
packages/core/utils/src/dml/properties/autoincrement.ts
Normal file
41
packages/core/utils/src/dml/properties/autoincrement.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
import { BaseProperty } from "./base"
|
||||
import { PrimaryKeyModifier } from "./primary-key"
|
||||
|
||||
/**
|
||||
* The AutoIncrementProperty is used to define a serial
|
||||
* property
|
||||
*/
|
||||
export class AutoIncrementProperty extends BaseProperty<number> {
|
||||
protected dataType: {
|
||||
name: "serial"
|
||||
options: {}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method indicates that the property is the data model's primary key.
|
||||
*
|
||||
* @example
|
||||
* import { model } from "@medusajs/framework/utils"
|
||||
*
|
||||
* const Product = model.define("Product", {
|
||||
* id: model.autoincrement().primaryKey(),
|
||||
* // ...
|
||||
* })
|
||||
*
|
||||
* export default Product
|
||||
*
|
||||
* @customNamespace Property Configuration Methods
|
||||
*/
|
||||
primaryKey() {
|
||||
return new PrimaryKeyModifier<number, AutoIncrementProperty>(this)
|
||||
}
|
||||
|
||||
constructor(options?: { primaryKey?: boolean }) {
|
||||
super()
|
||||
|
||||
this.dataType = {
|
||||
name: "serial",
|
||||
options: { ...options },
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
export * from "./array"
|
||||
export * from "./autoincrement"
|
||||
export * from "./base"
|
||||
export * from "./big-number"
|
||||
export * from "./boolean"
|
||||
|
||||
Reference in New Issue
Block a user