budibase/packages/server/scripts/load/create-many-relationships.js

150 lines
3.5 KiB
JavaScript
Raw Normal View History

2023-12-19 16:59:23 +01:00
#!/bin/node
const { createApp, getTable, createRow, createTable } = require("./utils")
2023-12-20 11:51:35 +01:00
const Chance = require("chance")
const generator = new Chance()
2023-12-20 13:04:16 +01:00
const STUDENT_COUNT = 500
2023-12-20 12:18:29 +01:00
const SUBJECT_COUNT = 10
2023-12-19 16:59:23 +01:00
2023-12-21 17:39:14 +01:00
const batchSize = 100
2023-12-19 16:59:23 +01:00
if (!process.argv[2]) {
console.error("Please specify an API key as script argument.")
process.exit(-1)
}
2023-12-20 13:04:16 +01:00
const start = Date.now()
2023-12-21 17:39:14 +01:00
async function batchCreate(apiKey, appId, count, table, generator) {
let i = 0
async function createSingleRow() {
const row = await createRow(apiKey, appId, table, generator())
console.log(
`${table.name} - ${++i} of ${count} created (${
(Date.now() - start) / 1000
}s)`
)
return row
}
const rows = []
for (let j = 0; j < count; j += batchSize) {
const batchPromises = Array.from(
{ length: Math.min(batchSize, count - j) },
createSingleRow
)
const batchRows = await Promise.all(batchPromises)
rows.push(...batchRows)
}
return rows
}
2023-12-19 16:59:23 +01:00
async function run() {
const apiKey = process.argv[2]
const app = await createApp(apiKey)
2023-12-20 12:30:35 +01:00
console.log(`App created: http://localhost:10000/builder/app/${app._id}`)
2023-12-20 12:18:29 +01:00
const studentsTable = await getTable(apiKey, app._id)
if (studentsTable.name !== "Students") {
throw 'Fetched table should be "Students"'
}
console.log(`Table found: ${studentsTable.name}`)
2023-12-19 16:59:23 +01:00
2023-12-20 12:52:25 +01:00
let studentNumber = studentsTable.schema["Auto ID"].lastID
2023-12-21 17:39:14 +01:00
const students = await batchCreate(
apiKey,
app._id,
STUDENT_COUNT,
studentsTable,
() => ({
"Student Number": (++studentNumber).toString(),
"First Name": generator.first(),
"Last Name": generator.last(),
Gender: generator.pickone(["M", "F"]),
Grade: generator.pickone(["8", "9", "10", "11"]),
"Tardiness (Days)": generator.integer({ min: 1, max: 100 }),
"Home Number": generator.phone(),
"Attendance_(%)": generator.integer({ min: 0, max: 100 }),
2023-12-21 17:22:41 +01:00
})
2023-12-21 17:24:48 +01:00
)
2023-12-20 15:02:21 +01:00
2023-12-19 16:59:23 +01:00
const subjectTable = await createTable(apiKey, app._id, {
schema: {
2023-12-20 11:51:35 +01:00
Name: {
2023-12-19 16:59:23 +01:00
name: "Name",
type: "string",
},
},
name: "Subjects",
2023-12-20 12:52:25 +01:00
primaryDisplay: "Name",
2023-12-19 16:59:23 +01:00
})
2023-12-20 11:51:35 +01:00
2023-12-21 17:39:14 +01:00
const subjects = await batchCreate(
apiKey,
app._id,
SUBJECT_COUNT,
subjectTable,
() => ({
Name: generator.profession(),
2023-12-21 17:22:41 +01:00
})
2023-12-21 17:24:48 +01:00
)
2023-12-20 15:02:21 +01:00
2023-12-20 12:52:25 +01:00
const gradesTable = await createTable(apiKey, app._id, {
schema: {
Score: {
name: "Score",
type: "number",
},
Student: {
name: "Student",
tableId: studentsTable._id,
constraints: {
presence: true,
type: "array",
},
fieldName: "Grades",
relationshipType: "one-to-many",
type: "link",
},
Subject: {
name: "Subject",
tableId: subjectTable._id,
constraints: {
presence: true,
type: "array",
},
fieldName: "Grades",
relationshipType: "one-to-many",
type: "link",
},
},
name: "Grades",
})
2023-12-21 17:22:41 +01:00
i = 0
2023-12-20 12:52:25 +01:00
for (const student of students) {
for (const subject of subjects) {
await createRow(apiKey, app._id, gradesTable, {
Score: generator.integer({ min: 0, max: 100 }),
Student: [student],
Subject: [subject],
2023-12-20 13:04:16 +01:00
})
2023-12-20 12:52:25 +01:00
console.log(
2023-12-20 13:04:16 +01:00
`Grade ${++i} of ${students.length * subjects.length} created (${
(Date.now() - start) / 1000
}s)`
2023-12-20 12:52:25 +01:00
)
}
2023-12-19 16:59:23 +01:00
}
}
2023-12-20 13:04:16 +01:00
run()
.then(() => {
2023-12-20 15:02:21 +01:00
console.log(`Done in ${(Date.now() - start) / 1000} seconds`)
2023-12-20 13:04:16 +01:00
})
.catch(err => {
console.error(err)
})