-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscratchpad.js
More file actions
173 lines (154 loc) · 4.5 KB
/
Copy pathscratchpad.js
File metadata and controls
173 lines (154 loc) · 4.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/*
proposed new format for fields config
name: 'id' //store the field name
alias:'id', //store the field alias
inputType: 'integer', //store the input type
required: true, // store if the field is required
primaryIndex: true // store if the field is the primary index
extendedType: 'guid' //store the extended type
disableAdd: true, //store if the field can be added
disableEdit: true //store if the field can be edited
foreignTable: 'projectDescription2' //store the foreign table
*/
const fieldsConfig = {
projects: {
fields: [
{
name: "id",
alias: "id",
inputType: "integer",
required: true,
primaryIndex: true,
},
{ name: "name", alias: "name", inputType: "text", required: true },
{
name: "guid",
alias: "guid",
inputType: "text",
extendedType: "guid",
disableAdd: true,
disableEdit: true,
},
{ name: "description", alias: "description", inputType: "text" },
{
name: "description2",
alias: "description2",
inputType: "text",
foreignTable: "projectDescription",
},
{
name: "createdAt",
alias: "createdAt",
inputType: "text",
foreignTable: "projectDescription2",
},
],
foreign: [
{
table: "projectDescription",
index: "projectid",
joinType: "INNER JOIN",
},
{
table: "projectDescription2",
index: "projectid",
joinType: "INNER JOIN",
},
// Add other foreign keys if necessary
],
},
user: {
fields: [
{ name: "id", inputType: "number", required: true, primaryIndex: true },
{
name: "name",
inputType: "select",
minLength: 5,
maxLength: 10,
required: true,
},
{ name: "email", inputType: "email", required: true },
{ name: "username", inputType: "text" },
],
// Add foreign key mappings if necessary
},
};
function buildSelectQuery(table, fieldsConfig) {
const tableConfig = fieldsConfig3[table];
const fields = tableConfig.fields;
const foreignConfig = tableConfig.foreign;
let selectFields = [];
let joinClauses = [];
let foreignTables = new Set();
// Add fields from the primary table
selectFields.push(...fields.map((field) => `${table}.${field.name}`));
// Process foreign fields
fields.forEach((field) => {
if (field.foreignTable) {
const foreign = foreignConfig.find((f) => f.table === field.foreignTable);
if (foreign) {
// Add the foreign fields to the select list
selectFields.push(
`${field.foreignTable}.${field.name} AS ${field.name}`
);
// Track the foreign table for joining
if (!foreignTables.has(field.foreignTable)) {
foreignTables.add(field.foreignTable);
joinClauses.push(
`${foreign.joinType} ${field.foreignTable} ON ${table}.projectid = ${field.foreignTable}.${foreign.index}`
);
}
}
}
});
// Construct the SQL query
const query = `
SELECT ${selectFields.join(", ")}
FROM ${table}
${joinClauses.join(" ")}
`;
return query;
}
// Example usage
const sqlQuery = buildSelectQuery("projects", fieldsConfig3);
console.log(sqlQuery);
function getFieldConfig(table, field) {
const tableConfig = fieldsConfig3[table];
const fieldConfig = tableConfig.fields.find((f) => f.name === field);
if (fieldConfig && fieldConfig.foreignTable) {
const foreignConfig = tableConfig.foreign.find(
(f) => f.table === fieldConfig.foreignTable
);
if (foreignConfig) {
fieldConfig.foreign = foreignConfig;
}
}
return fieldConfig;
}
function buildJoinQuery(table, fieldConfig) {
if (!fieldConfig.foreign) {
return "";
}
const {
table: foreignTable,
index: foreignIndex,
joinType,
} = fieldConfig.foreign;
const fieldsToSelect = fieldConfig.foreignFields
? fieldConfig.foreignFields.join(", ")
: "*";
return `
${joinType} ${foreignTable} ON ${table}.${fieldConfig.name} = ${foreignTable}.${foreignIndex}
SELECT ${table}.*, ${fieldsToSelect}
`;
}
// Example usage
const query = buildJoinQuery("projects", projectDescription2Config);
console.log(query);
// Example usage
const projectDescription2Config = getFieldConfig("projects", "description2");
console.log(projectDescription2Config);
// Example usage
const projectDescription2Config = getFieldConfig("projects", "description2");
console.log(projectDescription2Config);
s;