From 8d31130737e7e8baf0ea908e71d12be9e638cdc7 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sat, 26 Mar 2022 09:56:28 +0100 Subject: [PATCH] redis query splitter --- packages/query-splitter/src/options.ts | 8 +++++++ packages/query-splitter/src/splitQuery.ts | 23 ++++++++++++++++++++ packages/query-splitter/src/splitter.test.ts | 11 ++++++++++ 3 files changed, 42 insertions(+) diff --git a/packages/query-splitter/src/options.ts b/packages/query-splitter/src/options.ts index e72a6cbff..45c568d13 100644 --- a/packages/query-splitter/src/options.ts +++ b/packages/query-splitter/src/options.ts @@ -13,6 +13,7 @@ export interface SplitterOptions { javaScriptComments: boolean; returnRichInfo: boolean; + splitByLines: boolean; } export const defaultSplitterOptions: SplitterOptions = { @@ -31,6 +32,7 @@ export const defaultSplitterOptions: SplitterOptions = { javaScriptComments: false, returnRichInfo: false, + splitByLines: false, }; export const mysqlSplitterOptions: SplitterOptions = { @@ -83,3 +85,9 @@ export const noSplitSplitterOptions: SplitterOptions = { noSplit: true, }; + +export const redisSplitterOptions: SplitterOptions = { + ...defaultSplitterOptions, + + splitByLines: true, +}; diff --git a/packages/query-splitter/src/splitQuery.ts b/packages/query-splitter/src/splitQuery.ts index 7e63f1c4b..71dafb5ef 100644 --- a/packages/query-splitter/src/splitQuery.ts +++ b/packages/query-splitter/src/splitQuery.ts @@ -265,7 +265,30 @@ function markStartCommand(context: SplitLineContext) { } } +function splitByLines(context: SplitLineContext) { + while (context.position < context.end) { + if (context.source[context.position] == '\n') { + pushQuery(context); + context.commandPart = ''; + movePosition(context, 1); + context.currentCommandStart = context.position; + markStartCommand(context); + } else { + movePosition(context, 1); + } + } + + if (context.end > context.currentCommandStart) { + context.commandPart += context.source.slice(context.currentCommandStart, context.position); + } +} + export function splitQueryLine(context: SplitLineContext) { + if (context.options.splitByLines) { + splitByLines(context); + return; + } + while (context.position < context.end) { const token = scanToken(context); if (!token) { diff --git a/packages/query-splitter/src/splitter.test.ts b/packages/query-splitter/src/splitter.test.ts index 4eeb8e43b..6669cfe9c 100644 --- a/packages/query-splitter/src/splitter.test.ts +++ b/packages/query-splitter/src/splitter.test.ts @@ -4,6 +4,7 @@ import { postgreSplitterOptions, mongoSplitterOptions, noSplitSplitterOptions, + redisSplitterOptions, } from './options'; import { splitQuery } from './splitQuery'; @@ -90,6 +91,16 @@ test('split mongo', () => { expect(output).toEqual(['db.collection.insert({x:1})', 'db.collection.insert({y:2})']); }); +test('redis split by newline', () => { + const output = splitQuery('SET x 1\nSET y 2', redisSplitterOptions); + expect(output).toEqual(['SET x 1', 'SET y 2']); +}); + +test('redis split by newline 2', () => { + const output = splitQuery('SET x 1\n\nSET y 2\n', redisSplitterOptions); + expect(output).toEqual(['SET x 1', 'SET y 2']); +}); + test('count lines', () => { const output = splitQuery('SELECT * FROM `table1`;\nSELECT * FROM `table2`;', { ...mysqlSplitterOptions,