Skip to content

Commit 7da3aac

Browse files
refactoring to reduce complexity
1 parent 4d1d2f0 commit 7da3aac

File tree

1 file changed

+85
-33
lines changed

1 file changed

+85
-33
lines changed

src/utils/queryUtils.ts

Lines changed: 85 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -214,51 +214,103 @@ export function sanitizeQsqlQuery(query: string): string {
214214
let stringChar = "";
215215
let i = 0;
216216

217-
const isLineBreak = (c: string) => c === "\n" || c === "\r";
218-
219217
while (i < query.length) {
220218
const char = query[i];
221219

222-
// Start or end of string
223-
if (char === '"' || char === "'") {
224-
if (!inString) {
225-
inString = true;
226-
stringChar = char;
227-
} else if (char === stringChar) {
228-
inString = false;
229-
}
220+
if (isStringStart(char, inString)) {
221+
({ inString, stringChar, result, i } = handleStringStart(
222+
char,
223+
result,
224+
i,
225+
));
226+
} else if (isStringEnd(char, inString, stringChar)) {
227+
({ inString, result, i } = handleStringEnd(result, i));
228+
} else if (inString) {
229+
({ result, i } = handleInsideString(char, result, i));
230+
} else if (isBlockCommentStart(char, query, i)) {
231+
i = skipBlockComment(query, i);
232+
} else if (isLineCommentStart(char)) {
233+
i = skipLineComment(query, i);
234+
} else {
230235
result += char;
231236
i++;
232237
}
238+
}
233239

234-
// Inside string: preserve everything
235-
else if (inString) {
236-
result += char;
237-
i++;
238-
}
240+
return normalizeLineBreaks(result.trim());
241+
}
239242

240-
// Block comment: / ... \
241-
else if (char === "/" && query.indexOf("\\", i) > i) {
242-
const end = query.indexOf("\\", i);
243-
i = end >= 0 ? end + 1 : query.length;
244-
}
243+
function isStringStart(char: string, inString: boolean): boolean {
244+
return !inString && (char === '"' || char === "'");
245+
}
245246

246-
// Line comment: / to end of line
247-
else if (char === "/") {
248-
while (i < query.length && !isLineBreak(query[i])) i++;
249-
if (query[i] === "\r" && query[i + 1] === "\n") i += 2;
250-
else if (isLineBreak(query[i])) i++;
251-
}
247+
function handleStringStart(
248+
char: string,
249+
result: string,
250+
i: number,
251+
): { inString: boolean; stringChar: string; result: string; i: number } {
252+
return {
253+
inString: true,
254+
stringChar: char,
255+
result: result + char,
256+
i: i + 1,
257+
};
258+
}
252259

253-
// Normal character
254-
else {
255-
result += char;
256-
i++;
257-
}
260+
function isStringEnd(
261+
char: string,
262+
inString: boolean,
263+
stringChar: string,
264+
): boolean {
265+
return inString && char === stringChar;
266+
}
267+
268+
function handleStringEnd(
269+
result: string,
270+
i: number,
271+
): { inString: boolean; result: string; i: number } {
272+
return {
273+
inString: false,
274+
result: result + result[result.length - 1], // append last char again
275+
i: i + 1,
276+
};
277+
}
278+
279+
function handleInsideString(
280+
char: string,
281+
result: string,
282+
i: number,
283+
): { result: string; i: number } {
284+
return {
285+
result: result + char,
286+
i: i + 1,
287+
};
288+
}
289+
290+
function isBlockCommentStart(char: string, query: string, i: number): boolean {
291+
return char === "/" && query.indexOf("\\", i) > i;
292+
}
293+
294+
function skipBlockComment(query: string, i: number): number {
295+
const end = query.indexOf("\\", i);
296+
return end !== -1 ? end + 1 : query.length;
297+
}
298+
299+
function isLineCommentStart(char: string): boolean {
300+
return char === "/";
301+
}
302+
303+
function skipLineComment(query: string, i: number): number {
304+
while (i < query.length && query[i] !== "\n" && query[i] !== "\r") {
305+
i++;
258306
}
307+
if (query[i] === "\r" && query[i + 1] === "\n") return i + 2;
308+
if (query[i] === "\n" || query[i] === "\r") return i + 1;
309+
return i;
310+
}
259311

260-
// Final pass: normalize line breaks to ;
261-
return result.replace(/([^\s;])(?:\r?\n)+(?=\S)/g, "$1;").trim();
312+
function normalizeLineBreaks(input: string): string {
313+
return input.replace(/([^\s;])(?:\r?\n)+(?=\S)/g, "$1;");
262314
}
263315

264316
export function generateQSqlBody(

0 commit comments

Comments
 (0)