Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
Empty file added .github/.keep
Empty file.
223 changes: 212 additions & 11 deletions .github/workflows/classroom.yml
Original file line number Diff line number Diff line change
@@ -1,19 +1,220 @@
name: GitHub Classroom Workflow

on:
- push
- workflow_dispatch

name: Autograding Tests
'on':
- push
- workflow_dispatch
- repository_dispatch
permissions:
checks: write
actions: read
contents: read

jobs:
build:
name: Autograding
run-autograding-tests:
runs-on: ubuntu-latest
if: github.actor != 'github-classroom[bot]'
steps:
- uses: actions/checkout@v4
- uses: education/autograding@v1
- name: Checkout code
uses: actions/checkout@v4
- name: Step-1 Test
id: step-1-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-1 Test
setup-command: npm install
command: npm run test:1
timeout: 10
max-score: 10
- name: Step-2 Test
id: step-2-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-2 Test
setup-command: npm install
command: npm run test:2
timeout: 10
max-score: 10
- name: Step-3 Test
id: step-3-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-3 Test
setup-command: npm install
command: npm run test:3
timeout: 10
max-score: 10
- name: Step-4 Test
id: step-4-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-4 Test
setup-command: npm install
command: npm run test:4
timeout: 10
- name: Step-5 Test
id: step-5-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-5 Test
setup-command: npm install
command: npm run test:5
timeout: 10
max-score: 10
- name: Step-6 Test
id: step-6-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-6 Test
setup-command: npm install
command: npm run test:6
timeout: 10
max-score: 10
- name: Step-7 Test
id: step-7-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-7 Test
setup-command: npm install
command: npm run test:7
timeout: 10
max-score: 10
- name: Step-8 Test
id: step-8-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-8 Test
setup-command: npm install
command: npm run test:8
timeout: 10
max-score: 10
- name: Step-9 Test
id: step-9-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-9 Test
setup-command: npm install
command: npm run test:9
timeout: 10
max-score: 10
- name: Step-10 Test
id: step-10-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-10 Test
setup-command: npm install
command: npm run test:10
timeout: 10
max-score: 10
- name: Step-11 Test
id: step-11-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-11 Test
setup-command: npm install
command: npm run test:11
timeout: 10
max-score: 10
- name: Step-12 Test
id: step-12-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-12 Test
setup-command: npm install
command: npm run test:12
timeout: 10
max-score: 10
- name: Step-13 Test
id: step-13-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-13 Test
setup-command: npm install
command: npm run test:13
timeout: 10
max-score: 10
- name: Step-14 Test
id: step-14-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-14 Test
setup-command: npm install
command: npm run test:14
timeout: 10
max-score: 10
- name: Step-15 Test
id: step-15-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-15 Test
setup-command: npm install
command: npm run test:15
timeout: 10
max-score: 10
- name: Step-16 Test
id: step-16-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-16 Test
setup-command: npm install
command: npm run test:16
timeout: 10
max-score: 10
- name: Step-17 Test
id: step-17-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-17 Test
setup-command: npm install
command: npm run test:17
timeout: 10
max-score: 10
- name: Step-18 Test
id: step-18-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-18 Test
setup-command: npm install
command: npm run test:18
timeout: 10
max-score: 10
- name: Step-19 Test
id: step-19-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-19 Test
setup-command: npm install
command: npm run test:19
timeout: 10
max-score: 10
- name: Step-20 Test
id: step-20-test
uses: education/autograding-command-grader@v1
with:
test-name: Step-20 Test
setup-command: npm install
command: npm run test:20
timeout: 10
max-score: 10
- name: Autograding Reporter
uses: education/autograding-grading-reporter@v1
env:
STEP-1-TEST_RESULTS: "${{steps.step-1-test.outputs.result}}"
STEP-2-TEST_RESULTS: "${{steps.step-2-test.outputs.result}}"
STEP-3-TEST_RESULTS: "${{steps.step-3-test.outputs.result}}"
STEP-4-TEST_RESULTS: "${{steps.step-4-test.outputs.result}}"
STEP-5-TEST_RESULTS: "${{steps.step-5-test.outputs.result}}"
STEP-6-TEST_RESULTS: "${{steps.step-6-test.outputs.result}}"
STEP-7-TEST_RESULTS: "${{steps.step-7-test.outputs.result}}"
STEP-8-TEST_RESULTS: "${{steps.step-8-test.outputs.result}}"
STEP-9-TEST_RESULTS: "${{steps.step-9-test.outputs.result}}"
STEP-10-TEST_RESULTS: "${{steps.step-10-test.outputs.result}}"
STEP-11-TEST_RESULTS: "${{steps.step-11-test.outputs.result}}"
STEP-12-TEST_RESULTS: "${{steps.step-12-test.outputs.result}}"
STEP-13-TEST_RESULTS: "${{steps.step-13-test.outputs.result}}"
STEP-14-TEST_RESULTS: "${{steps.step-14-test.outputs.result}}"
STEP-15-TEST_RESULTS: "${{steps.step-15-test.outputs.result}}"
STEP-16-TEST_RESULTS: "${{steps.step-16-test.outputs.result}}"
STEP-17-TEST_RESULTS: "${{steps.step-17-test.outputs.result}}"
STEP-18-TEST_RESULTS: "${{steps.step-18-test.outputs.result}}"
STEP-19-TEST_RESULTS: "${{steps.step-19-test.outputs.result}}"
STEP-20-TEST_RESULTS: "${{steps.step-20-test.outputs.result}}"
with:
runners: step-1-test,step-2-test,step-3-test,step-4-test,step-5-test,step-6-test,step-7-test,step-8-test,step-9-test,step-10-test,step-11-test,step-12-test,step-13-test,step-14-test,step-15-test,step-16-test,step-17-test,step-18-test,step-19-test,step-20-test
6 changes: 6 additions & 0 deletions enrollment.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
student_id,course
1,Mathematics
1,Physics
2,Chemistry
3,Mathematics
5,Biology
4 changes: 4 additions & 0 deletions sample.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
id,name,age
1,John,30
2,Jane,25
3,Bob,22
73 changes: 73 additions & 0 deletions src/cli.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
#!/usr/bin/env node

const readline = require("readline");
const {
executeSELECTQuery,
executeINSERTQuery,
executeDELETEQuery,
} = require("./queryExecutor.js");

const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});

rl.setPrompt("SQL> ");
console.log(
'SQL Query Engine CLI. Enter your SQL commands, or type "exit" to quit.'
);

rl.prompt();

rl.on("line", async (line) => {
if (line.toLowerCase() === "exit") {
rl.close();
return;
}

try {
// Execute the query - do your own implementation
const query = line.trim();

// Determine the type of SQL command (SELECT, INSERT, DELETE, etc.)
const queryType = determineQueryType(query);

// Execute the appropriate query based on the command type
switch (queryType) {
case "SELECT":
const result = await executeSELECTQuery(query);
console.log("Result:", result);
break;
case "INSERT":
await executeINSERTQuery(query);
console.log("Successfully Inserted");
break;
case "DELETE":
const msg = await executeDELETEQuery(query);
console.log(msg.message);
break;
default:
throw new Error(`Unsupported SQL command: ${query}`);
}
} catch (error) {
console.error("Error:", error.message);
}

rl.prompt();
}).on("close", () => {
console.log("Exiting SQL CLI");
process.exit(0);
});

function determineQueryType(query) {
const normalizedQuery = query.trim().toLowerCase();
if (normalizedQuery.startsWith("select")) {
return "SELECT";
} else if (normalizedQuery.startsWith("insert")) {
return "INSERT";
} else if (normalizedQuery.startsWith("delete")) {
return "DELETE";
} else {
throw new Error(`Unsupported SQL command: ${query}`);
}
}
78 changes: 78 additions & 0 deletions src/csvReader.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// src/csvReader.js

const fs = require("fs");
const csv = require("csv-parser");

function readCSV(filePath) {
const results = [];

return new Promise((resolve, reject) => {
fs.createReadStream(filePath)
.pipe(csv())
.on("data", (data) => results.push(data))
.on("end", () => {
resolve(results);
})
.on("error", (error) => {
reject(error);
});
});
}

async function writeCSV(filename, data) {
if (data.length < 1) {
throw new Error("No data to write to CSV");
}

// Prepare headers for CSV file
const fields = Object.keys(data[0]);
// let orderedFields = fields;
// let existingData = [];

// if (fs.existsSync(filename)) {
// // Read existing data from CSV file
// existingData = await readCSV(filename);
// orderedFields =
// existingData.length >= 1 ? Object.keys(existingData[0]) : fields;
// console.log(existingData);
//}
const outputStream = fs.createWriteStream(filename);

const headers = fields.join(",") + "\n";
outputStream.write(headers);

// Prepare new rows to write to CSV file
const newDataRows = data.map((row) => {
return fields.map((field) => row[field]).join(",");
});

// Combine existing data with new data
// const allRows = existingData
// .map((row) => {
// return orderedFields.map((field) => row[field]).join(",");
// })
// .concat(newDataRows);

// Write all rows to CSV file
newDataRows.forEach((rowData) => {
outputStream.write(rowData + "\n");
});

outputStream.end();

return new Promise((resolve, reject) => {
outputStream.on("finish", () => {
resolve();
});

outputStream.on("error", (err) => {
console.error(
`Error occurred while writing CSV file "${filename}":`,
err
);
reject(err);
});
});
}

module.exports = { readCSV, writeCSV };
Loading