@wxn0brp/db-string-query 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/.github/workflows/build.yml +18 -0
  2. package/CHANGELOG.md +44 -0
  3. package/bun.lock +118 -0
  4. package/dist/sql/handle/collection.d.ts +4 -0
  5. package/dist/sql/handle/collection.js +26 -0
  6. package/dist/sql/handle/delete.d.ts +1 -0
  7. package/dist/sql/handle/delete.js +11 -0
  8. package/dist/sql/handle/insert.d.ts +1 -0
  9. package/dist/sql/handle/insert.js +52 -0
  10. package/dist/sql/handle/select.d.ts +7 -0
  11. package/dist/sql/handle/select.js +55 -0
  12. package/dist/sql/handle/update.d.ts +1 -0
  13. package/dist/sql/handle/update.js +12 -0
  14. package/dist/sql/index.d.ts +2 -2
  15. package/dist/sql/index.js +10 -4
  16. package/dist/sql/utils/join.util.d.ts +10 -0
  17. package/dist/sql/utils/join.util.js +55 -0
  18. package/dist/sql/where.js +54 -17
  19. package/dist/types.d.ts +5 -1
  20. package/package.json +41 -39
  21. package/src/sql/handle/collection.ts +28 -0
  22. package/src/sql/handle/delete.ts +12 -0
  23. package/src/sql/handle/insert.ts +50 -0
  24. package/src/sql/handle/select.ts +68 -0
  25. package/src/sql/handle/update.ts +13 -0
  26. package/src/sql/index.ts +12 -13
  27. package/src/sql/utils/join.util.ts +73 -0
  28. package/src/sql/where.ts +53 -17
  29. package/src/types.ts +9 -1
  30. package/suglite.json +2 -2
  31. package/test/js.test.ts +103 -0
  32. package/test/sql/delete.test.ts +95 -0
  33. package/test/sql/index.test.ts +17 -0
  34. package/test/sql/insert.test.ts +95 -0
  35. package/test/sql/select.test.ts +92 -0
  36. package/test/sql/update.test.ts +85 -0
  37. package/test/sql/utils/join.test.ts +42 -0
  38. package/test/tsconfig.json +19 -0
  39. package/tsconfig.json +7 -3
  40. package/typedocs-generated/.nojekyll +1 -0
  41. package/typedocs-generated/404.html +76 -0
  42. package/typedocs-generated/assets/hierarchy.js +1 -0
  43. package/typedocs-generated/assets/highlight.css +78 -0
  44. package/typedocs-generated/assets/icons.js +18 -0
  45. package/typedocs-generated/assets/icons.svg +1 -0
  46. package/typedocs-generated/assets/main.js +60 -0
  47. package/typedocs-generated/assets/navigation.js +1 -0
  48. package/typedocs-generated/assets/search.js +1 -0
  49. package/typedocs-generated/assets/style.css +1633 -0
  50. package/typedocs-generated/classes/js.default.html +3 -0
  51. package/typedocs-generated/classes/sql_index.default.html +3 -0
  52. package/typedocs-generated/classes/sql_utils_join.util.JoinToRelationsEngine.html +3 -0
  53. package/typedocs-generated/functions/sql_handle_collection.handleCreate.html +1 -0
  54. package/typedocs-generated/functions/sql_handle_collection.handleDrop.html +1 -0
  55. package/typedocs-generated/functions/sql_handle_collection.handleExists.html +1 -0
  56. package/typedocs-generated/functions/sql_handle_collection.handleGet.html +1 -0
  57. package/typedocs-generated/functions/sql_handle_delete.handleDelete.html +1 -0
  58. package/typedocs-generated/functions/sql_handle_insert.handleInsert.html +1 -0
  59. package/typedocs-generated/functions/sql_handle_select.handleSelect.html +1 -0
  60. package/typedocs-generated/functions/sql_handle_select.parseJoinClauses.html +1 -0
  61. package/typedocs-generated/functions/sql_handle_select.parseSelectClause.html +1 -0
  62. package/typedocs-generated/functions/sql_handle_update.handleUpdate.html +1 -0
  63. package/typedocs-generated/functions/sql_utils.parseReturn.html +1 -0
  64. package/typedocs-generated/functions/sql_utils.parseSet.html +1 -0
  65. package/typedocs-generated/functions/sql_where.parseWhere.html +1 -0
  66. package/typedocs-generated/hierarchy.html +1 -0
  67. package/typedocs-generated/index.html +35 -0
  68. package/typedocs-generated/interfaces/types.Opts.html +3 -0
  69. package/typedocs-generated/interfaces/types.ValtheraParser.html +2 -0
  70. package/typedocs-generated/interfaces/types.ValtheraQuery.html +3 -0
  71. package/typedocs-generated/media/LICENSE +21 -0
  72. package/typedocs-generated/modules/.html +1 -0
  73. package/typedocs-generated/modules/index.html +1 -0
  74. package/typedocs-generated/modules/js.html +1 -0
  75. package/typedocs-generated/modules/sql_handle_collection.html +1 -0
  76. package/typedocs-generated/modules/sql_handle_delete.html +1 -0
  77. package/typedocs-generated/modules/sql_handle_insert.html +1 -0
  78. package/typedocs-generated/modules/sql_handle_select.html +1 -0
  79. package/typedocs-generated/modules/sql_handle_update.html +1 -0
  80. package/typedocs-generated/modules/sql_index.html +1 -0
  81. package/typedocs-generated/modules/sql_utils.html +1 -0
  82. package/typedocs-generated/modules/sql_utils_join.util.html +1 -0
  83. package/typedocs-generated/modules/sql_where.html +1 -0
  84. package/typedocs-generated/modules/types.html +1 -0
  85. package/typedocs-generated/modules.html +1 -0
  86. package/typedocs-generated/types/sql_utils_join.util.JoinClause.html +1 -0
  87. package/typedocs-generated/variables/.ValtheraDbParsers.html +1 -0
  88. package/typedocs-generated/variables/.ValtheraDbRelations.html +1 -0
  89. package/dist/sql/handle.d.ts +0 -12
  90. package/dist/sql/handle.js +0 -119
  91. package/src/sql/handle.ts +0 -129
package/dist/sql/where.js CHANGED
@@ -1,5 +1,5 @@
1
1
  const operators = {
2
- "=": "",
2
+ "=": null,
3
3
  "<": "$lt",
4
4
  ">": "$gt",
5
5
  "<=": "$lte",
@@ -8,6 +8,29 @@ const operators = {
8
8
  "IN": "$in",
9
9
  "NOT IN": "$nin"
10
10
  };
11
+ function mergeQueries(target, source) {
12
+ for (const key in source) {
13
+ if (key.startsWith('$')) {
14
+ // If the key is an operator, simply add it
15
+ target[key] = source[key];
16
+ }
17
+ else {
18
+ // If the key is a field, check if there is not already an operator in the target
19
+ if (target[key] !== undefined) {
20
+ // If target[key] is an object with an operator, merge the objects
21
+ if (typeof target[key] === 'object' && !Array.isArray(target[key])) {
22
+ Object.assign(target[key], source[key]);
23
+ }
24
+ else {
25
+ target[key] = source[key];
26
+ }
27
+ }
28
+ else {
29
+ target[key] = source[key];
30
+ }
31
+ }
32
+ }
33
+ }
11
34
  export function parseWhere(where) {
12
35
  if (!where)
13
36
  return {};
@@ -55,15 +78,21 @@ export function parseWhere(where) {
55
78
  current = groupedQuery;
56
79
  }
57
80
  else if (op === "AND") {
58
- current = { ...parentCurrent, ...groupedQuery };
81
+ const newCurrent = {};
82
+ mergeQueries(newCurrent, parentCurrent);
83
+ mergeQueries(newCurrent, groupedQuery);
84
+ current = newCurrent;
59
85
  }
60
86
  }
61
87
  else {
62
- current = { ...parentCurrent, ...groupedQuery };
88
+ const newCurrent = {};
89
+ mergeQueries(newCurrent, parentCurrent);
90
+ mergeQueries(newCurrent, groupedQuery);
91
+ current = newCurrent;
63
92
  }
64
93
  // Restore parent's stack and operator stack
65
94
  operatorStack = parentFrame.operatorStack;
66
- stack = parentStack;
95
+ stack = parentFrame.stack;
67
96
  }
68
97
  else if (token.toUpperCase() === "AND" || token.toUpperCase() === "OR") {
69
98
  operatorStack.push(token.toUpperCase());
@@ -79,10 +108,13 @@ export function parseWhere(where) {
79
108
  }
80
109
  }
81
110
  let key = token;
82
- let op = tokens[++i]?.trim();
111
+ if (key.includes(".")) {
112
+ key = key.split(".").pop();
113
+ }
114
+ let opToken = tokens[++i]?.trim();
83
115
  let value = tokens[++i]?.trim();
84
- if (!key || !op || value === undefined) {
85
- throw new Error(`Invalid condition near '${key} ${op} ${value}'`);
116
+ if (!key || !opToken || value === undefined) {
117
+ throw new Error(`Invalid condition near '${key} ${opToken} ${value}'`);
86
118
  }
87
119
  // Handle quoted values
88
120
  if ((value.startsWith("'") && value.endsWith("'")) || (value.startsWith('"') && value.endsWith('"'))) {
@@ -93,9 +125,9 @@ export function parseWhere(where) {
93
125
  value = Number(value);
94
126
  }
95
127
  // Handle IN and NOT IN operations
96
- if (op.toUpperCase() === "IN" || op.toUpperCase() === "NOT IN") {
128
+ if (opToken.toUpperCase() === "IN" || opToken.toUpperCase() === "NOT IN") {
97
129
  if (!value.startsWith("(") || !value.endsWith(")")) {
98
- throw new Error(`Invalid syntax for '${op}' near '${value}'`);
130
+ throw new Error(`Invalid syntax for '${opToken}' near '${value}'`);
99
131
  }
100
132
  value = value.slice(1, -1).split(",").map((v) => {
101
133
  v = v.trim();
@@ -105,18 +137,23 @@ export function parseWhere(where) {
105
137
  return isNaN(Number(v)) ? v : Number(v);
106
138
  });
107
139
  }
108
- // Map the operator to MongoDB's query operators
109
- const mappedOp = operators[op.toUpperCase()] || "";
110
- if (mappedOp) {
111
- if (mappedOp === "$not") {
112
- current[key] = { [mappedOp]: value };
140
+ // Map the operator to the query operators
141
+ const mappedOp = operators[opToken.toUpperCase()];
142
+ if (mappedOp !== undefined) {
143
+ if (mappedOp === null) {
144
+ // "=" operator - direct assignment
145
+ current[key] = value;
113
146
  }
114
147
  else {
115
- current[key] = current[key] || {};
116
- current[key][mappedOp] = value;
148
+ // Other operators - they go to the root level
149
+ if (!current[mappedOp]) {
150
+ current[mappedOp] = {};
151
+ }
152
+ current[mappedOp][key] = value;
117
153
  }
118
154
  }
119
155
  else {
156
+ // If operator not found, default to direct assignment
120
157
  current[key] = value;
121
158
  }
122
159
  }
@@ -128,4 +165,4 @@ export function parseWhere(where) {
128
165
  }
129
166
  return current;
130
167
  }
131
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hlcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3FsL3doZXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sU0FBUyxHQUEyQjtJQUN0QyxHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxLQUFLO0lBQ1YsR0FBRyxFQUFFLEtBQUs7SUFDVixJQUFJLEVBQUUsTUFBTTtJQUNaLElBQUksRUFBRSxNQUFNO0lBQ1osSUFBSSxFQUFFLE1BQU07SUFDWixJQUFJLEVBQUUsS0FBSztJQUNYLFFBQVEsRUFBRSxNQUFNO0NBQ25CLENBQUM7QUFFRixNQUFNLFVBQVUsVUFBVSxDQUFDLEtBQWE7SUFDcEMsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN0QixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDN0IsSUFBSSxPQUFPLEtBQUssRUFBRSxJQUFJLE9BQU8sS0FBSyxHQUFHO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFakQsb0VBQW9FO0lBQ3BFLE1BQU0sTUFBTSxHQUFHLEtBQUs7U0FDZixPQUFPLENBQUMsMENBQTBDLEVBQUUsR0FBRyxDQUFDO1NBQ3hELEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUUxRCxJQUFJLE1BQU0sR0FBMkUsRUFBRSxDQUFDO0lBQ3hGLElBQUksT0FBTyxHQUFnQixFQUFFLENBQUM7SUFDOUIsSUFBSSxhQUFhLEdBQWEsRUFBRSxDQUFDO0lBQ2pDLElBQUksS0FBSyxHQUFVLEVBQUUsQ0FBQztJQUV0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsS0FBSztZQUFF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
168
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hlcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3FsL3doZXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sU0FBUyxHQUEyQjtJQUN0QyxHQUFHLEVBQUUsSUFBSTtJQUNULEdBQUcsRUFBRSxLQUFLO0lBQ1YsR0FBRyxFQUFFLEtBQUs7SUFDVixJQUFJLEVBQUUsTUFBTTtJQUNaLElBQUksRUFBRSxNQUFNO0lBQ1osSUFBSSxFQUFFLE1BQU07SUFDWixJQUFJLEVBQUUsS0FBSztJQUNYLFFBQVEsRUFBRSxNQUFNO0NBQ25CLENBQUM7QUFFRixTQUFTLFlBQVksQ0FBQyxNQUFtQixFQUFFLE1BQW1CO0lBQzFELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7UUFDdkIsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsMkNBQTJDO1lBQzNDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsQ0FBQzthQUFNLENBQUM7WUFDSixpRkFBaUY7WUFDakYsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzVCLGtFQUFrRTtnQkFDbEUsSUFBSSxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ2pFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxDQUFDO3FCQUFNLENBQUM7b0JBQ0osTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDOUIsQ0FBQztZQUNMLENBQUM7aUJBQU0sQ0FB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
package/dist/types.d.ts CHANGED
@@ -2,6 +2,10 @@ export interface ValtheraQuery {
2
2
  method: string;
3
3
  args: any[];
4
4
  }
5
+ export interface Opts {
6
+ defaultDbKey: string;
7
+ tableDbMap?: Record<string, string>;
8
+ }
5
9
  export interface ValtheraParser {
6
- parse(query: string): ValtheraQuery;
10
+ parse(query: string, opts?: Opts): ValtheraQuery;
7
11
  }
package/package.json CHANGED
@@ -1,44 +1,46 @@
1
1
  {
2
- "name": "@wxn0brp/db-string-query",
3
- "version": "0.0.7",
4
- "main": "dist/index.js",
5
- "types": "dist/index.d.ts",
6
- "repository": {
7
- "type": "git",
8
- "url": "https://github.com/wxn0brP/ValtheraDB-string-query.git"
2
+ "name": "@wxn0brp/db-string-query",
3
+ "version": "0.0.9",
4
+ "main": "dist/index.js",
5
+ "types": "dist/index.d.ts",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/wxn0brP/ValtheraDB-string-query.git"
9
+ },
10
+ "homepage": "https://github.com/wxn0brP/ValtheraDB-string-query",
11
+ "author": "wxn0brP",
12
+ "license": "MIT",
13
+ "type": "module",
14
+ "devDependencies": {
15
+ "@types/bun": "*",
16
+ "@types/node": "*",
17
+ "@wxn0brp/db-core": "^0.2.7",
18
+ "json5": "^2.2.3",
19
+ "tsc-alias": "*",
20
+ "typescript": "*"
21
+ },
22
+ "peerDependencies": {
23
+ "@wxn0brp/db-core": ">=0.2.7",
24
+ "json5": "^2.2.3"
25
+ },
26
+ "peerDependenciesMeta": {
27
+ "json5": {
28
+ "optional": true
9
29
  },
10
- "homepage": "https://github.com/wxn0brP/ValtheraDB-string-query",
11
- "author": "wxn0brP",
12
- "license": "MIT",
13
- "type": "module",
14
- "scripts": {
15
- "build": "tsc && tsc-alias",
16
- "start": "node dist/index.js"
17
- },
18
- "devDependencies": {
19
- "@types/node": "*",
20
- "json5": "^2.2.3",
21
- "tsc-alias": "*",
22
- "typescript": "*"
23
- },
24
- "peerDependencies": {
25
- "json5": "^2.2.3"
26
- },
27
- "peerDependenciesMeta": {
28
- "json5": {
29
- "optional": true
30
- }
30
+ "@wxn0brp/db-core": {
31
+ "optional": true
32
+ }
33
+ },
34
+ "exports": {
35
+ ".": {
36
+ "types": "./dist/index.d.ts",
37
+ "default": "./dist/index.js",
38
+ "import": "./dist/index.js"
31
39
  },
32
- "exports": {
33
- ".": {
34
- "types": "./dist/index.d.ts",
35
- "default": "./dist/index.js",
36
- "import": "./dist/index.js"
37
- },
38
- "./*": {
39
- "types": "./dist/*.d.ts",
40
- "default": "./dist/*.js",
41
- "import": "./dist/*.js"
42
- }
40
+ "./*": {
41
+ "types": "./dist/*.d.ts",
42
+ "default": "./dist/*.js",
43
+ "import": "./dist/*.js"
43
44
  }
45
+ }
44
46
  }
@@ -0,0 +1,28 @@
1
+ import { parseReturn } from "../utils";
2
+
3
+ export function handleGet(query: string) {
4
+ if (!/^GET\s+COLLECTIONS$/i.test(query)) {
5
+ throw new Error("Invalid GET COLLECTIONS syntax.");
6
+ }
7
+ return parseReturn("getCollections", []);
8
+ }
9
+
10
+ export function handleCreate(query: string) {
11
+ const match = query.match(
12
+ /^CREATE\s+(?:TABLE|COLLECTION)\s+(IF\s+NOT\s+EXISTS\s+)?(\w+).*/i
13
+ );
14
+ if (!match) throw new Error("Invalid CREATE TABLE/COLLECTION syntax.");
15
+ return parseReturn("ensureCollection", [match[2]]);
16
+ }
17
+
18
+ export function handleDrop(query: string) {
19
+ const match = query.match(/^DROP\s+(?:TABLE|COLLECTION)\s+(?:IF\s+EXISTS\s+)?(\w+)$/i);
20
+ if (!match) throw new Error("Invalid DROP TABLE/COLLECTION syntax.");
21
+ return parseReturn("removeCollection", [match[1]]);
22
+ }
23
+
24
+ export function handleExists(query: string) {
25
+ const match = query.match(/^EXISTS\s+(?:TABLE|COLLECTION)\s+(\w+)$/i);
26
+ if (!match) throw new Error("Invalid EXISTS TABLE/COLLECTION syntax.");
27
+ return parseReturn("issetCollection", [match[1]]);
28
+ }
@@ -0,0 +1,12 @@
1
+ import { parseReturn } from "#sql/utils";
2
+ import { parseWhere } from "#sql/where";
3
+
4
+ export function handleDelete(query: string) {
5
+ const match = query.match(/DELETE FROM ([\w\/]+)(?: WHERE (.+))?/i);
6
+ if (!match) throw new Error("Invalid DELETE syntax");
7
+
8
+ const collection = match[1];
9
+ const whereClause = match[2] ? parseWhere(match[2]) : {};
10
+
11
+ return parseReturn("remove", [collection, whereClause]);
12
+ }
@@ -0,0 +1,50 @@
1
+ import { parseReturn } from "#sql/utils";
2
+
3
+ export function handleInsert(query: string) {
4
+ const match = query.match(/INSERT INTO ([\w\/]+)\s*\(([^)]+)\)\s*VALUES\s*\(([^)]+)\)/i);
5
+ if (!match) throw new Error("Invalid INSERT syntax");
6
+ const collection = match[1];
7
+ const keys = match[2].split(/\s*,\s*/);
8
+
9
+ function splitByCommasOutsideQuotes(str: string): string[] {
10
+ const tokens: string[] = [];
11
+ let current = '';
12
+ let inSingleQuote = false;
13
+ let inDoubleQuote = false;
14
+
15
+ for (let i = 0; i < str.length; i++) {
16
+ const char = str[i];
17
+ if ((char === "'") && !inDoubleQuote) {
18
+ inSingleQuote = !inSingleQuote;
19
+ current += char;
20
+ } else if (char === '"' && !inSingleQuote) {
21
+ inDoubleQuote = !inDoubleQuote;
22
+ current += char;
23
+ } else if (char === ',' && !inSingleQuote && !inDoubleQuote) {
24
+ tokens.push(current);
25
+ current = '';
26
+ } else {
27
+ current += char;
28
+ }
29
+ }
30
+ tokens.push(current);
31
+ return tokens;
32
+ }
33
+
34
+ const rawValues = splitByCommasOutsideQuotes(match[3]);
35
+ const values = rawValues.map(v => {
36
+ v = v.trim();
37
+ if (v.length >= 2) {
38
+ if (v[0] === "'" && v[v.length - 1] === "'") {
39
+ v = v.substring(1, v.length - 1);
40
+ } else if (v[0] === '"' && v[v.length - 1] === '"') {
41
+ v = v.substring(1, v.length - 1);
42
+ }
43
+ }
44
+ return v;
45
+ });
46
+
47
+ if (keys.length !== values.length) throw new Error("Number of columns and values does not match");
48
+ const data = Object.fromEntries(keys.map((k, i) => [k, isNaN(values[i] as any) ? values[i] : Number(values[i])]));
49
+ return parseReturn("add", [collection, data]);
50
+ }
@@ -0,0 +1,68 @@
1
+ import { parseReturn } from "#sql/utils";
2
+ import { parseWhere } from "#sql/where";
3
+ import { Opts } from "#types.js";
4
+ import { JoinToRelationsEngine } from "../utils/join.util.js";
5
+
6
+ export function handleSelect(
7
+ query: string,
8
+ opts?: Opts,
9
+ ) {
10
+ let whereClauseStr: string | undefined;
11
+ let mainQueryPart = query;
12
+
13
+ const whereIndex = query.toUpperCase().lastIndexOf(" WHERE ");
14
+ if (whereIndex !== -1) {
15
+ whereClauseStr = query.substring(whereIndex + 7).trim();
16
+ mainQueryPart = query.substring(0, whereIndex);
17
+ }
18
+
19
+ const match = mainQueryPart.match(/SELECT\s+(.+?)\s+FROM\s+([\w\/]+)((?:\s+JOIN\s+.+)*)?/i);
20
+ if (!match) throw new Error("Invalid SELECT syntax");
21
+
22
+ const columnsPart = match[1].trim();
23
+ const collection = match[2];
24
+ const joinPart = match[3] || "";
25
+ const whereClause = whereClauseStr ? parseWhere(whereClauseStr) : {};
26
+
27
+ const findOpts = parseSelectClause(columnsPart);
28
+
29
+ if (joinPart && opts?.defaultDbKey) {
30
+ const joinClauses = parseJoinClauses(joinPart);
31
+ const relationsEngine = new JoinToRelationsEngine(opts.defaultDbKey, opts.tableDbMap);
32
+ const relations = relationsEngine.buildRelations(joinClauses, collection);
33
+ const path = [opts.defaultDbKey, collection];
34
+ return parseReturn("relation-find", [path, whereClause, relations, findOpts]);
35
+ }
36
+
37
+ return parseReturn("find", [collection, whereClause, {}, findOpts]);
38
+ }
39
+
40
+ export function parseJoinClauses(joinPart: string): Record<string, string> {
41
+ const joinClauses: Record<string, string> = {};
42
+ const joinRegex = /\s+JOIN\s+([\w\/]+)(?:\s+AS\s+)?([\w\/]+)?\s+ON\s+([^\s]+)\s*=\s*([^\s]+)/gi;
43
+ let match;
44
+ while ((match = joinRegex.exec(joinPart)) !== null) {
45
+ const table = match[1];
46
+ const alias = match[2] || table;
47
+ const condition = `${match[3]} = ${match[4]}`;
48
+ joinClauses[alias] = condition;
49
+ }
50
+ return joinClauses;
51
+ }
52
+
53
+ export function parseSelectClause(selectClause: string): { select?: string[]; exclude?: string[] } {
54
+ selectClause = selectClause.trim();
55
+
56
+ if (selectClause === "*") return {};
57
+
58
+ const excludeMatch = selectClause.match(/\*\s+EXCLUDE\s+(.+)/i);
59
+ if (excludeMatch) {
60
+ return {
61
+ exclude: excludeMatch[1].split(/\s*,\s*/),
62
+ };
63
+ }
64
+
65
+ return {
66
+ select: selectClause.split(/\s*,\s*/),
67
+ };
68
+ }
@@ -0,0 +1,13 @@
1
+ import { parseReturn, parseSet } from "#sql/utils";
2
+ import { parseWhere } from "#sql/where";
3
+
4
+ export function handleUpdate(query: string) {
5
+ const match = query.match(/UPDATE\s+([\w\/]+)\s+SET\s+(.+)\s+WHERE\s+(.+)/i);
6
+ if (!match) throw new Error("Invalid UPDATE syntax");
7
+
8
+ const collection = match[1];
9
+ const setClause = parseSet(match[2]);
10
+ const whereClause = parseWhere(match[3]);
11
+
12
+ return parseReturn("update", [collection, whereClause, setClause]);
13
+ }
package/src/sql/index.ts CHANGED
@@ -1,23 +1,22 @@
1
- import { ValtheraParser } from "../types";
2
- import {
3
- handleCreate,
4
- handleDelete,
5
- handleDrop,
6
- handleExists,
7
- handleGet,
8
- handleInsert,
9
- handleSelect,
10
- handleUpdate
11
- } from "./handle";
1
+ import { Opts, ValtheraParser } from "../types";
2
+ import { handleCreate, handleDrop, handleExists, handleGet } from "./handle/collection";
3
+ import { handleDelete } from "./handle/delete";
4
+ import { handleInsert } from "./handle/insert";
5
+ import { handleSelect } from "./handle/select";
6
+ import { handleUpdate } from "./handle/update";
12
7
 
13
8
  class SQLParser implements ValtheraParser {
14
- parse(query: string) {
9
+ parse(
10
+ query: string,
11
+ opts?: Opts
12
+ ) {
15
13
  query = query.replace(/\s+/g, " ").trim();
14
+ if (query.endsWith(";")) query = query.slice(0, -1);
16
15
  const tokens = query.split(/\s+/);
17
16
  const method = tokens[0].toUpperCase();
18
17
 
19
18
  if (method === "SELECT") {
20
- return handleSelect(query);
19
+ return handleSelect(query, opts);
21
20
  } else if (method === "INSERT") {
22
21
  return handleInsert(query);
23
22
  } else if (method === "UPDATE") {
@@ -0,0 +1,73 @@
1
+ import { RelationTypes } from "@wxn0brp/db-core";
2
+ export type JoinClause = Record<string, string>;
3
+
4
+ export class JoinToRelationsEngine {
5
+ private knownForeignKeys: Set<string> = new Set();
6
+
7
+ constructor(
8
+ private defaultDbKey: string,
9
+ private tableDbMap?: Record<string, string>
10
+ ) { }
11
+
12
+ private identifyPkFk(left: string, right: string, mainTable: string, knownFks: Set<string>): { pk: string, fk: string } {
13
+ const [leftTable, leftField] = left.split(".");
14
+ const [rightTable, rightField] = right.split(".");
15
+
16
+ // Check if one of the fields is already known as a foreign key
17
+ const leftFull = `${leftTable}.${leftField}`;
18
+ const rightFull = `${rightTable}.${rightField}`;
19
+
20
+ if (knownFks.has(leftFull))
21
+ return { pk: right, fk: left };
22
+ else if (knownFks.has(rightFull))
23
+ return { pk: left, fk: right };
24
+
25
+ // If either of the above conditions are met, use a heuristic: set pk to the field named "id" or "_id"
26
+ if (leftField === "id" || leftField === "_id") {
27
+ return { pk: left, fk: right };
28
+ } else if (rightField === "id" || rightField === "_id") {
29
+ return { pk: right, fk: left };
30
+ }
31
+
32
+ if (leftTable === mainTable)
33
+ return { pk: left, fk: right };
34
+ else if (rightTable === mainTable)
35
+ return { pk: right, fk: left };
36
+
37
+ // If still unsure, throw an error
38
+ throw new Error(`Cannot determine pk/fk from condition: "${left} = ${right}"`);
39
+ }
40
+
41
+ public buildRelations(
42
+ joinClauses: JoinClause,
43
+ mainTable: string
44
+ ): RelationTypes.Relation {
45
+ const relations: RelationTypes.Relation = {};
46
+ const knownFks = new Set(this.knownForeignKeys);
47
+
48
+ for (const [alias, condition] of Object.entries(joinClauses)) {
49
+ const [left, right] = condition.split(/\s*=\s*/);
50
+
51
+ const { pk, fk } = this.identifyPkFk(left, right, mainTable, knownFks);
52
+
53
+ const [pkTable, pkField] = pk.split(".");
54
+ const [fkTable, fkField] = fk.split(".");
55
+
56
+ knownFks.add(`${fkTable}.${fkField}`);
57
+
58
+ const dbKey = this.tableDbMap?.[fkTable] || this.defaultDbKey;
59
+
60
+ relations[alias] = {
61
+ type: "1n",
62
+ path: [dbKey, fkTable],
63
+ pk: pkField,
64
+ fk: fkField,
65
+ as: alias,
66
+ };
67
+ }
68
+
69
+ this.knownForeignKeys = knownFks;
70
+
71
+ return relations;
72
+ }
73
+ }