build: open ts strict check (#279)
* feat: no check lib dir * feat: open strict check to src dir * test: update test tsconfig.json * feat: remove any type * feat: do not export AbstractParseTreeVisitor * feat: export StmtContextType as enum * build: improve antlr4 script
This commit is contained in:
@ -15,8 +15,8 @@ describe('BasicSQL unit tests', () => {
|
||||
|
||||
test('Create lexer with errorListener', () => {
|
||||
const sql = '袋鼠云数栈UED团队';
|
||||
const errors: any[] = [];
|
||||
const errorListener: ErrorListener<any> = (err) => {
|
||||
const errors = [];
|
||||
const errorListener: ErrorListener = (err) => {
|
||||
errors.push(err);
|
||||
};
|
||||
const lexer = flink.createLexer(sql, errorListener);
|
||||
@ -35,8 +35,8 @@ describe('BasicSQL unit tests', () => {
|
||||
|
||||
test('Create parser with errorListener (lexer error)', () => {
|
||||
const sql = '袋鼠云数栈UED团队';
|
||||
const errors: any[] = [];
|
||||
const errorListener: ErrorListener<any> = (err) => {
|
||||
const errors = [];
|
||||
const errorListener: ErrorListener = (err) => {
|
||||
errors.push(err);
|
||||
};
|
||||
const parser = flink.createParser(sql, errorListener);
|
||||
@ -46,8 +46,8 @@ describe('BasicSQL unit tests', () => {
|
||||
|
||||
test('Create parser with errorListener (parse error)', () => {
|
||||
const sql = 'SHOW TA';
|
||||
const errors: any[] = [];
|
||||
const errorListener: ErrorListener<any> = (err) => {
|
||||
const errors = [];
|
||||
const errorListener: ErrorListener = (err) => {
|
||||
errors.push(err);
|
||||
};
|
||||
const parser = flink.createParser(sql, errorListener);
|
||||
@ -57,8 +57,8 @@ describe('BasicSQL unit tests', () => {
|
||||
|
||||
test('Parse right input', () => {
|
||||
const sql = 'SELECT * FROM tb1';
|
||||
const errors: any[] = [];
|
||||
const errorListener: ErrorListener<any> = (err) => {
|
||||
const errors = [];
|
||||
const errorListener: ErrorListener = (err) => {
|
||||
errors.push(err);
|
||||
};
|
||||
const parseTree = flink.parse(sql, errorListener);
|
||||
@ -70,8 +70,8 @@ describe('BasicSQL unit tests', () => {
|
||||
|
||||
test('Parse wrong input', () => {
|
||||
const sql = '袋鼠云数栈UED团队';
|
||||
const errors: any[] = [];
|
||||
const errorListener: ErrorListener<any> = (err) => {
|
||||
const errors = [];
|
||||
const errorListener: ErrorListener = (err) => {
|
||||
errors.push(err);
|
||||
};
|
||||
const parseTree = flink.parse(sql, errorListener);
|
||||
|
@ -19,7 +19,7 @@ describe('FlinkSQL benchmark tests', () => {
|
||||
const reportData: string[] = [];
|
||||
|
||||
test('createTable Over 100 Rows', async () => {
|
||||
const [totalTimes, averageTimes, msg] = benchmark('CreateTable Over 100 Rows', () => {
|
||||
const [totalTimes, averageTimes] = benchmark('CreateTable Over 100 Rows', () => {
|
||||
const testSQL = features.createTable[0];
|
||||
const res = flink.validate(testSQL);
|
||||
expect(res).toEqual([]);
|
||||
@ -28,7 +28,7 @@ describe('FlinkSQL benchmark tests', () => {
|
||||
});
|
||||
|
||||
test('createTable Over 1000 Rows', async () => {
|
||||
const [totalTimes, averageTimes, msg] = benchmark('CreateTable Over 1000 Rows', () => {
|
||||
const [totalTimes, averageTimes] = benchmark('CreateTable Over 1000 Rows', () => {
|
||||
const testSQL = features.createTable[1];
|
||||
const res = flink.validate(testSQL);
|
||||
expect(res).toEqual([]);
|
||||
@ -37,7 +37,7 @@ describe('FlinkSQL benchmark tests', () => {
|
||||
});
|
||||
|
||||
test('createTable Over 5000 Rows', async () => {
|
||||
const [totalTimes, averageTimes, msg] = benchmark('CreateTable Over 5000 Rows', () => {
|
||||
const [totalTimes, averageTimes] = benchmark('CreateTable Over 5000 Rows', () => {
|
||||
const testSQL = features.createTable[2];
|
||||
const res = flink.validate(testSQL);
|
||||
expect(res).toEqual([]);
|
||||
@ -46,7 +46,7 @@ describe('FlinkSQL benchmark tests', () => {
|
||||
});
|
||||
|
||||
test('selectTable Over 100 Rows', async () => {
|
||||
const [totalTimes, averageTimes, msg] = benchmark('SelectTable Over 100 Rows', () => {
|
||||
const [totalTimes, averageTimes] = benchmark('SelectTable Over 100 Rows', () => {
|
||||
const testSQL = features.selectTable[0];
|
||||
const res = flink.validate(testSQL);
|
||||
expect(res).toEqual([]);
|
||||
@ -55,7 +55,7 @@ describe('FlinkSQL benchmark tests', () => {
|
||||
});
|
||||
|
||||
test('selectTable Over 1000 Rows', async () => {
|
||||
const [totalTimes, averageTimes, msg] = benchmark('SelectTable Over 1000 Rows', () => {
|
||||
const [totalTimes, averageTimes] = benchmark('SelectTable Over 1000 Rows', () => {
|
||||
const testSQL = features.selectTable[1];
|
||||
const res = flink.validate(testSQL);
|
||||
expect(res).toEqual([]);
|
||||
@ -64,7 +64,7 @@ describe('FlinkSQL benchmark tests', () => {
|
||||
});
|
||||
|
||||
test('selectTable Over 5000 Rows', async () => {
|
||||
const [totalTimes, averageTimes, msg] = benchmark('SelectTable Over 5000 Rows', () => {
|
||||
const [totalTimes, averageTimes] = benchmark('SelectTable Over 5000 Rows', () => {
|
||||
const testSQL = features.selectTable[2];
|
||||
const res = flink.validate(testSQL);
|
||||
expect(res).toEqual([]);
|
||||
@ -73,7 +73,7 @@ describe('FlinkSQL benchmark tests', () => {
|
||||
});
|
||||
|
||||
test('insertTable Over 100 Rows', async () => {
|
||||
const [totalTimes, averageTimes, msg] = benchmark('InsertTable Over 100 Rows', () => {
|
||||
const [totalTimes, averageTimes] = benchmark('InsertTable Over 100 Rows', () => {
|
||||
const testSQL = features.insertTable[0];
|
||||
const res = flink.validate(testSQL);
|
||||
expect(res).toEqual([]);
|
||||
@ -82,7 +82,7 @@ describe('FlinkSQL benchmark tests', () => {
|
||||
});
|
||||
|
||||
test('insertTable Over 1000 Rows', async () => {
|
||||
const [totalTimes, averageTimes, msg] = benchmark('InsertTable Over 1000 Rows', () => {
|
||||
const [totalTimes, averageTimes] = benchmark('InsertTable Over 1000 Rows', () => {
|
||||
const testSQL = features.insertTable[1];
|
||||
const res = flink.validate(testSQL);
|
||||
expect(res).toEqual([]);
|
||||
@ -91,7 +91,7 @@ describe('FlinkSQL benchmark tests', () => {
|
||||
});
|
||||
|
||||
test('insertTable Over 5000 Rows', async () => {
|
||||
const [totalTimes, averageTimes, msg] = benchmark('InsertTable Over 5000 Rows', () => {
|
||||
const [totalTimes, averageTimes] = benchmark('InsertTable Over 5000 Rows', () => {
|
||||
const testSQL = features.insertTable[2];
|
||||
const res = flink.validate(testSQL);
|
||||
expect(res).toEqual([]);
|
||||
|
@ -1,4 +1,3 @@
|
||||
import { ErrorNode, ParserRuleContext, TerminalNode } from 'antlr4ng';
|
||||
import { FlinkSQL } from 'src/parser/flink';
|
||||
import { FlinkSqlParserListener } from 'src/lib/flink/FlinkSqlParserListener';
|
||||
import { TableExpressionContext } from 'src/lib/flink/FlinkSqlParser';
|
||||
@ -11,20 +10,17 @@ describe('Flink SQL Listener Tests', () => {
|
||||
const parseTree = flink.parse(sql);
|
||||
|
||||
test('Listener enterTableName', async () => {
|
||||
let result = '';
|
||||
class MyListener implements FlinkSqlParserListener {
|
||||
enterTableExpression = (ctx: TableExpressionContext): void => {
|
||||
result = ctx.getText().toLowerCase();
|
||||
};
|
||||
visitTerminal(node: TerminalNode): void {}
|
||||
visitErrorNode(node: ErrorNode): void {}
|
||||
enterEveryRule(node: ParserRuleContext): void {}
|
||||
exitEveryRule(node: ParserRuleContext): void {}
|
||||
}
|
||||
const listenTableName = new MyListener();
|
||||
class MyListener extends FlinkSqlParserListener {
|
||||
result = '';
|
||||
|
||||
await flink.listen(listenTableName, parseTree);
|
||||
expect(result).toBe(expectTableName);
|
||||
enterTableExpression = (ctx: TableExpressionContext): void => {
|
||||
this.result = ctx.getText().toLowerCase();
|
||||
};
|
||||
}
|
||||
const listener = new MyListener();
|
||||
|
||||
flink.listen(listener, parseTree);
|
||||
expect(listener.result).toBe(expectTableName);
|
||||
});
|
||||
|
||||
test('Split sql listener', async () => {
|
||||
|
@ -23,8 +23,6 @@ describe('Flink SQL Syntax Suggestion with collect entity', () => {
|
||||
};
|
||||
const sql = commentOtherLine(syntaxSql, pos.lineNumber);
|
||||
|
||||
const parseTree = flink.parse(sql);
|
||||
|
||||
const syntaxes = flink.getSuggestionAtCaretPosition(sql, pos)?.syntax;
|
||||
const suggestion = syntaxes?.find(
|
||||
(syn) => syn.syntaxContextType === EntityContextType.COLUMN
|
||||
|
@ -1,7 +1,6 @@
|
||||
import { FlinkSQL } from 'src/parser/flink';
|
||||
import { FlinkSqlParserVisitor } from 'src/lib/flink/FlinkSqlParserVisitor';
|
||||
import { AbstractParseTreeVisitor } from 'antlr4ng';
|
||||
import { TableExpressionContext } from 'src/lib/flink/FlinkSqlParser';
|
||||
import { ProgramContext, TableExpressionContext } from 'src/lib/flink/FlinkSqlParser';
|
||||
|
||||
describe('Flink SQL Visitor Tests', () => {
|
||||
const expectTableName = 'user1';
|
||||
@ -13,20 +12,22 @@ describe('Flink SQL Visitor Tests', () => {
|
||||
});
|
||||
|
||||
test('Visitor visitTableName', () => {
|
||||
let result = '';
|
||||
class MyVisitor
|
||||
extends AbstractParseTreeVisitor<any>
|
||||
implements FlinkSqlParserVisitor<any>
|
||||
{
|
||||
protected defaultResult() {
|
||||
return result;
|
||||
class MyVisitor extends FlinkSqlParserVisitor<string> {
|
||||
defaultResult(): string {
|
||||
return '';
|
||||
}
|
||||
visitTableExpression(ctx: TableExpressionContext) {
|
||||
result = ctx.getText().toLowerCase();
|
||||
aggregateResult(aggregate: string, nextResult: string): string {
|
||||
return aggregate + nextResult;
|
||||
}
|
||||
visitProgram = (ctx: ProgramContext) => {
|
||||
return this.visitChildren(ctx);
|
||||
};
|
||||
visitTableExpression = (ctx: TableExpressionContext) => {
|
||||
return ctx.getText().toLowerCase();
|
||||
};
|
||||
}
|
||||
const visitor: any = new MyVisitor();
|
||||
visitor.visit(parseTree);
|
||||
const visitor = new MyVisitor();
|
||||
const result = visitor.visit(parseTree);
|
||||
|
||||
expect(result).toBe(expectTableName);
|
||||
});
|
||||
|
@ -1,6 +1,5 @@
|
||||
import { ParseTreeListener } from 'antlr4ng';
|
||||
import { HiveSQL } from 'src/parser/hive';
|
||||
import { ProgramContext, SelectItemContext } from 'src/lib/hive/HiveSqlParser';
|
||||
import { SelectItemContext } from 'src/lib/hive/HiveSqlParser';
|
||||
import { HiveSqlParserListener } from 'src/lib/hive/HiveSqlParserListener';
|
||||
|
||||
describe('HiveSQL Listener Tests', () => {
|
||||
@ -10,39 +9,33 @@ describe('HiveSQL Listener Tests', () => {
|
||||
const sql = `select ${expectTableName} from tablename where inc_day='20190601' limit 1000;`;
|
||||
const parseTree = hive.parse(sql);
|
||||
|
||||
let result = '';
|
||||
class MyListener implements HiveSqlParserListener {
|
||||
enterSelectItem(ctx: SelectItemContext) {
|
||||
result = ctx.getText();
|
||||
}
|
||||
visitTerminal() {}
|
||||
visitErrorNode() {}
|
||||
enterEveryRule() {}
|
||||
exitEveryRule() {}
|
||||
}
|
||||
const listenTableName = new MyListener();
|
||||
class MyListener extends HiveSqlParserListener {
|
||||
result = '';
|
||||
|
||||
await hive.listen(listenTableName as ParseTreeListener, parseTree as ProgramContext);
|
||||
expect(result).toBe(expectTableName);
|
||||
enterSelectItem = (ctx: SelectItemContext) => {
|
||||
this.result = ctx.getText();
|
||||
};
|
||||
}
|
||||
const listener = new MyListener();
|
||||
|
||||
hive.listen(listener, parseTree);
|
||||
expect(listener.result).toBe(expectTableName);
|
||||
});
|
||||
|
||||
test('Listener enterCreateTable', async () => {
|
||||
const sql = `drop table table_name;`;
|
||||
const parseTree = hive.parse(sql);
|
||||
let result = '';
|
||||
class MyListener implements HiveSqlParserListener {
|
||||
enterDropTableStatement(ctx) {
|
||||
result = ctx.getText();
|
||||
}
|
||||
class MyListener extends HiveSqlParserListener {
|
||||
result = '';
|
||||
|
||||
visitTerminal() {}
|
||||
visitErrorNode() {}
|
||||
enterEveryRule() {}
|
||||
exitEveryRule() {}
|
||||
enterDropTableStatement = (ctx) => {
|
||||
this.result = ctx.getText();
|
||||
};
|
||||
}
|
||||
const listenTableName = new MyListener();
|
||||
const listener = new MyListener();
|
||||
|
||||
await hive.listen(listenTableName as ParseTreeListener, parseTree as ProgramContext);
|
||||
expect(result).toBe('droptabletable_name');
|
||||
hive.listen(listener, parseTree);
|
||||
expect(listener.result).toBe('droptabletable_name');
|
||||
});
|
||||
|
||||
test('Split sql listener', async () => {
|
||||
|
@ -1,5 +1,3 @@
|
||||
import { AbstractParseTreeVisitor } from 'antlr4ng';
|
||||
|
||||
import { HiveSQL } from 'src/parser/hive';
|
||||
import { HiveSqlParserVisitor } from 'src/lib/hive/HiveSqlParserVisitor';
|
||||
import { ProgramContext, TableNameContext } from 'src/lib/hive/HiveSqlParser';
|
||||
@ -14,19 +12,23 @@ describe('HiveSQL Visitor Tests', () => {
|
||||
});
|
||||
|
||||
test('Visitor visitTableName', () => {
|
||||
let result = '';
|
||||
class MyVisitor extends AbstractParseTreeVisitor<any> implements HiveSqlParserVisitor<any> {
|
||||
defaultResult() {
|
||||
return result;
|
||||
class MyVisitor extends HiveSqlParserVisitor<string> {
|
||||
defaultResult(): string {
|
||||
return '';
|
||||
}
|
||||
|
||||
visitTableName(ctx: TableNameContext) {
|
||||
result = ctx.getText().toLowerCase();
|
||||
aggregateResult(aggregate: string, nextResult: string): string {
|
||||
return aggregate + nextResult;
|
||||
}
|
||||
visitProgram = (ctx: ProgramContext) => {
|
||||
return this.visitChildren(ctx);
|
||||
};
|
||||
visitTableName = (ctx: TableNameContext) => {
|
||||
return ctx.getText().toLowerCase();
|
||||
};
|
||||
}
|
||||
|
||||
const visitor = new MyVisitor();
|
||||
visitor.visit(parseTree as ProgramContext);
|
||||
const result = visitor.visit(parseTree);
|
||||
|
||||
expect(result).toBe(expectTableName);
|
||||
});
|
||||
|
@ -1,6 +1,5 @@
|
||||
import { ImpalaSQL } from 'src/parser/impala';
|
||||
import { ImpalaSqlParserListener } from 'src/lib/impala/ImpalaSqlParserListener';
|
||||
import { ParseTreeListener } from 'antlr4ng';
|
||||
|
||||
describe('impala SQL Listener Tests', () => {
|
||||
const expectTableName = 'user1';
|
||||
@ -11,19 +10,14 @@ describe('impala SQL Listener Tests', () => {
|
||||
|
||||
test('Listener enterTableNamePath', async () => {
|
||||
let result = '';
|
||||
class MyListener implements ImpalaSqlParserListener {
|
||||
class MyListener extends ImpalaSqlParserListener {
|
||||
enterTableNamePath = (ctx): void => {
|
||||
result = ctx.getText().toLowerCase();
|
||||
};
|
||||
|
||||
visitTerminal() {}
|
||||
visitErrorNode() {}
|
||||
enterEveryRule() {}
|
||||
exitEveryRule() {}
|
||||
}
|
||||
const listenTableName = new MyListener();
|
||||
const listener = new MyListener();
|
||||
|
||||
await impala.listen(listenTableName as ParseTreeListener, parseTree);
|
||||
impala.listen(listener, parseTree);
|
||||
expect(result).toBe(expectTableName);
|
||||
});
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
import { ImpalaSQL } from 'src/parser/impala';
|
||||
import { AbstractParseTreeVisitor } from 'antlr4ng';
|
||||
import { ImpalaSqlParserVisitor } from 'src/lib/impala/ImpalaSqlParserVisitor';
|
||||
|
||||
describe('impala SQL Visitor Tests', () => {
|
||||
@ -12,20 +11,22 @@ describe('impala SQL Visitor Tests', () => {
|
||||
});
|
||||
|
||||
test('Visitor visitTableNamePath', () => {
|
||||
let result = '';
|
||||
class MyVisitor
|
||||
extends AbstractParseTreeVisitor<any>
|
||||
implements ImpalaSqlParserVisitor<any>
|
||||
{
|
||||
protected defaultResult() {
|
||||
return result;
|
||||
class MyVisitor extends ImpalaSqlParserVisitor<string> {
|
||||
defaultResult(): string {
|
||||
return '';
|
||||
}
|
||||
visitTableNamePath = (ctx): void => {
|
||||
result = ctx.getText().toLowerCase();
|
||||
aggregateResult(aggregate: string, nextResult: string): string {
|
||||
return aggregate + nextResult;
|
||||
}
|
||||
visitProgram = (ctx) => {
|
||||
return this.visitChildren(ctx);
|
||||
};
|
||||
visitTableNamePath = (ctx) => {
|
||||
return ctx.getText().toLowerCase();
|
||||
};
|
||||
}
|
||||
const visitor: any = new MyVisitor();
|
||||
visitor.visit(parseTree);
|
||||
const visitor = new MyVisitor();
|
||||
const result = visitor.visit(parseTree);
|
||||
|
||||
expect(result).toBe(expectTableName);
|
||||
});
|
||||
|
@ -1,6 +1,5 @@
|
||||
import { MySQL } from 'src/parser/mysql';
|
||||
import { MySqlParserListener } from 'src/lib/mysql/MySqlParserListener';
|
||||
import { ParseTreeListener } from 'antlr4ng';
|
||||
|
||||
describe('MySQL Listener Tests', () => {
|
||||
const expectTableName = 'user1';
|
||||
@ -10,20 +9,17 @@ describe('MySQL Listener Tests', () => {
|
||||
const parseTree = mysql.parse(sql);
|
||||
|
||||
test('Listener enterTableName', async () => {
|
||||
let result = '';
|
||||
class MyListener implements MySqlParserListener {
|
||||
enterTableName = (ctx): void => {
|
||||
result = ctx.getText().toLowerCase();
|
||||
};
|
||||
visitTerminal() {}
|
||||
visitErrorNode() {}
|
||||
enterEveryRule() {}
|
||||
exitEveryRule() {}
|
||||
}
|
||||
const listenTableName: any = new MyListener();
|
||||
class MyListener extends MySqlParserListener {
|
||||
result = '';
|
||||
|
||||
await mysql.listen(listenTableName as ParseTreeListener, parseTree);
|
||||
expect(result).toBe(expectTableName);
|
||||
enterTableName = (ctx): void => {
|
||||
this.result = ctx.getText().toLowerCase();
|
||||
};
|
||||
}
|
||||
const listener = new MyListener();
|
||||
|
||||
mysql.listen(listener, parseTree);
|
||||
expect(listener.result).toBe(expectTableName);
|
||||
});
|
||||
|
||||
test('Split sql listener', async () => {
|
||||
|
@ -1,6 +1,5 @@
|
||||
import { MySQL } from 'src/parser/mysql';
|
||||
import { MySqlParserVisitor } from 'src/lib/mysql/MySqlParserVisitor';
|
||||
import { AbstractParseTreeVisitor } from 'antlr4ng';
|
||||
|
||||
describe('MySQL Visitor Tests', () => {
|
||||
const expectTableName = 'user1';
|
||||
@ -12,18 +11,22 @@ describe('MySQL Visitor Tests', () => {
|
||||
});
|
||||
|
||||
test('Visitor visitTableName', () => {
|
||||
let result = '';
|
||||
class MyVisitor extends AbstractParseTreeVisitor<any> implements MySqlParserVisitor<any> {
|
||||
protected defaultResult() {
|
||||
return result;
|
||||
class MyVisitor extends MySqlParserVisitor<string> {
|
||||
defaultResult(): string {
|
||||
return '';
|
||||
}
|
||||
|
||||
visitTableName = (ctx): void => {
|
||||
result = ctx.getText().toLowerCase();
|
||||
aggregateResult(aggregate: string, nextResult: string): string {
|
||||
return aggregate + nextResult;
|
||||
}
|
||||
visitProgram = (ctx) => {
|
||||
return this.visitChildren(ctx);
|
||||
};
|
||||
visitTableName = (ctx) => {
|
||||
return ctx.getText().toLowerCase();
|
||||
};
|
||||
}
|
||||
const visitor = new MyVisitor();
|
||||
visitor.visit(parseTree);
|
||||
const result = visitor.visit(parseTree);
|
||||
|
||||
expect(result).toBe(expectTableName);
|
||||
});
|
||||
|
@ -1,5 +1,4 @@
|
||||
import { PLSQL } from 'src/parser/plsql';
|
||||
import { ParseTreeListener } from 'antlr4ng';
|
||||
import { PlSqlParserListener } from 'src/lib/plsql/PlSqlParserListener';
|
||||
|
||||
describe('PLSQL Listener Tests', () => {
|
||||
@ -10,19 +9,16 @@ describe('PLSQL Listener Tests', () => {
|
||||
const parseTree = plsql.parse(sql);
|
||||
|
||||
test('Listener enterTableName', async () => {
|
||||
let result = '';
|
||||
class MyListener implements PlSqlParserListener {
|
||||
enterTable_ref_list = (ctx): void => {
|
||||
result = ctx.getText().toLowerCase();
|
||||
};
|
||||
visitTerminal() {}
|
||||
visitErrorNode() {}
|
||||
enterEveryRule() {}
|
||||
exitEveryRule() {}
|
||||
}
|
||||
const listenTableName = new MyListener();
|
||||
class MyListener extends PlSqlParserListener {
|
||||
result = '';
|
||||
|
||||
await plsql.listen(listenTableName as ParseTreeListener, parseTree);
|
||||
expect(result).toBe(expectTableName);
|
||||
enterTable_ref_list = (ctx) => {
|
||||
this.result = ctx.getText().toLowerCase();
|
||||
};
|
||||
}
|
||||
const listener = new MyListener();
|
||||
|
||||
plsql.listen(listener, parseTree);
|
||||
expect(listener.result).toBe(expectTableName);
|
||||
});
|
||||
});
|
||||
|
@ -1,5 +1,4 @@
|
||||
import { PLSQL } from 'src/parser/plsql';
|
||||
import { AbstractParseTreeVisitor } from 'antlr4ng';
|
||||
import { PlSqlParserVisitor } from 'src/lib/plsql/PlSqlParserVisitor';
|
||||
|
||||
describe('PLSQL Visitor Tests', () => {
|
||||
@ -10,17 +9,22 @@ describe('PLSQL Visitor Tests', () => {
|
||||
const parseTree = plsql.parse(sql);
|
||||
|
||||
test('Visitor visitTable_ref_list', () => {
|
||||
let result = '';
|
||||
class MyVisitor extends AbstractParseTreeVisitor<any> implements PlSqlParserVisitor<any> {
|
||||
protected defaultResult() {
|
||||
return result;
|
||||
class MyVisitor extends PlSqlParserVisitor<string> {
|
||||
defaultResult(): string {
|
||||
return '';
|
||||
}
|
||||
visitTable_ref_list = (ctx): void => {
|
||||
result = ctx.getText().toLowerCase();
|
||||
aggregateResult(aggregate: string, nextResult: string): string {
|
||||
return aggregate + nextResult;
|
||||
}
|
||||
visitProgram = (ctx) => {
|
||||
return this.visitChildren(ctx);
|
||||
};
|
||||
visitTable_ref_list = (ctx) => {
|
||||
return ctx.getText().toLowerCase();
|
||||
};
|
||||
}
|
||||
const visitor: any = new MyVisitor();
|
||||
visitor.visit(parseTree);
|
||||
const visitor = new MyVisitor();
|
||||
const result = visitor.visit(parseTree);
|
||||
|
||||
expect(result).toBe(expectTableName);
|
||||
});
|
||||
|
@ -1,6 +1,5 @@
|
||||
import { PostgreSQL } from 'src/parser/postgresql';
|
||||
import { PostgreSqlParserListener } from 'src/lib/postgresql/PostgreSqlParserListener';
|
||||
import { ParseTreeListener } from 'antlr4ng';
|
||||
|
||||
describe('PostgreSQL Listener Tests', () => {
|
||||
const expectTableName = 'user1';
|
||||
@ -10,20 +9,16 @@ describe('PostgreSQL Listener Tests', () => {
|
||||
const parseTree = postgresql.parse(sql);
|
||||
|
||||
test('Listener enterTableName', async () => {
|
||||
let result = '';
|
||||
class MyListener implements PostgreSqlParserListener {
|
||||
enterTable_ref(ctx) {
|
||||
result = ctx.getText().toLowerCase();
|
||||
}
|
||||
visitTerminal() {}
|
||||
visitErrorNode() {}
|
||||
enterEveryRule() {}
|
||||
exitEveryRule() {}
|
||||
class MyListener extends PostgreSqlParserListener {
|
||||
result = '';
|
||||
enterTable_ref = (ctx) => {
|
||||
this.result = ctx.getText().toLowerCase();
|
||||
};
|
||||
}
|
||||
const listenTableName = new MyListener();
|
||||
const listener = new MyListener();
|
||||
|
||||
await postgresql.listen(listenTableName as ParseTreeListener, parseTree);
|
||||
expect(result).toBe(expectTableName);
|
||||
postgresql.listen(listener, parseTree);
|
||||
expect(listener.result).toBe(expectTableName);
|
||||
});
|
||||
|
||||
test('Split sql listener', async () => {
|
||||
|
@ -1,5 +1,4 @@
|
||||
import { PostgreSQL } from 'src/parser/postgresql';
|
||||
import { AbstractParseTreeVisitor } from 'antlr4ng';
|
||||
import { PostgreSqlParserVisitor } from 'src/lib/postgresql/PostgreSqlParserVisitor';
|
||||
|
||||
describe('MySQL Visitor Tests', () => {
|
||||
@ -12,21 +11,22 @@ describe('MySQL Visitor Tests', () => {
|
||||
});
|
||||
|
||||
test('Visitor visitTableName', () => {
|
||||
let result = '';
|
||||
class MyVisitor
|
||||
extends AbstractParseTreeVisitor<any>
|
||||
implements PostgreSqlParserVisitor<any>
|
||||
{
|
||||
protected defaultResult() {
|
||||
return result;
|
||||
class MyVisitor extends PostgreSqlParserVisitor<string> {
|
||||
defaultResult(): string {
|
||||
return '';
|
||||
}
|
||||
|
||||
visitTable_ref(ctx) {
|
||||
result = ctx.getText().toLowerCase();
|
||||
aggregateResult(aggregate: string, nextResult: string): string {
|
||||
return aggregate + nextResult;
|
||||
}
|
||||
visitProgram = (ctx) => {
|
||||
return this.visitChildren(ctx);
|
||||
};
|
||||
visitTable_ref = (ctx) => {
|
||||
return ctx.getText().toLowerCase();
|
||||
};
|
||||
}
|
||||
const visitor: any = new MyVisitor();
|
||||
visitor.visit(parseTree);
|
||||
const visitor = new MyVisitor();
|
||||
const result = visitor.visit(parseTree);
|
||||
|
||||
expect(result).toBe(expectTableName);
|
||||
});
|
||||
|
@ -1,6 +1,5 @@
|
||||
import { SparkSQL } from 'src/parser/spark';
|
||||
import { SparkSqlParserListener } from 'src/lib/spark/SparkSqlParserListener';
|
||||
import { ParseTreeListener } from 'antlr4ng';
|
||||
|
||||
describe('Spark SQL Listener Tests', () => {
|
||||
const expectTableName = 'user1';
|
||||
@ -10,20 +9,16 @@ describe('Spark SQL Listener Tests', () => {
|
||||
const parseTree = spark.parse(sql);
|
||||
|
||||
test('Listener exitTableName', () => {
|
||||
let result = '';
|
||||
class MyListener implements SparkSqlParserListener {
|
||||
class MyListener extends SparkSqlParserListener {
|
||||
result = '';
|
||||
exitTableName = (ctx): void => {
|
||||
result = ctx.getText().toLowerCase();
|
||||
this.result = ctx.getText().toLowerCase();
|
||||
};
|
||||
visitTerminal() {}
|
||||
visitErrorNode() {}
|
||||
enterEveryRule() {}
|
||||
exitEveryRule() {}
|
||||
}
|
||||
const listenTableName = new MyListener();
|
||||
const listener = new MyListener();
|
||||
|
||||
spark.listen(listenTableName as ParseTreeListener, parseTree);
|
||||
expect(result).toBe(expectTableName);
|
||||
spark.listen(listener, parseTree);
|
||||
expect(listener.result).toBe(expectTableName);
|
||||
});
|
||||
|
||||
test('Split sql listener', async () => {
|
||||
|
@ -1,6 +1,5 @@
|
||||
import { SparkSQL } from 'src/parser/spark';
|
||||
import { SparkSqlParserVisitor } from 'src/lib/spark/SparkSqlParserVisitor';
|
||||
import { AbstractParseTreeVisitor } from 'antlr4ng';
|
||||
|
||||
describe('Spark SQL Visitor Tests', () => {
|
||||
const expectTableName = 'user1';
|
||||
@ -12,21 +11,23 @@ describe('Spark SQL Visitor Tests', () => {
|
||||
});
|
||||
|
||||
test('Visitor visitTableName', () => {
|
||||
class MyVisitor
|
||||
extends AbstractParseTreeVisitor<any>
|
||||
implements SparkSqlParserVisitor<any>
|
||||
{
|
||||
result: string = '';
|
||||
protected defaultResult() {
|
||||
return this.result;
|
||||
class MyVisitor extends SparkSqlParserVisitor<string> {
|
||||
defaultResult(): string {
|
||||
return '';
|
||||
}
|
||||
visitTableName = (ctx): void => {
|
||||
this.result = ctx.getText().toLowerCase();
|
||||
aggregateResult(aggregate: string, nextResult: string): string {
|
||||
return aggregate + nextResult;
|
||||
}
|
||||
visitProgram = (ctx) => {
|
||||
return this.visitChildren(ctx);
|
||||
};
|
||||
visitTableName = (ctx) => {
|
||||
return ctx.getText().toLowerCase();
|
||||
};
|
||||
}
|
||||
const visitor = new MyVisitor();
|
||||
visitor.visit(parseTree);
|
||||
const result = visitor.visit(parseTree);
|
||||
|
||||
expect(visitor.result).toBe(expectTableName);
|
||||
expect(result).toBe(expectTableName);
|
||||
});
|
||||
});
|
||||
|
@ -1,6 +1,5 @@
|
||||
import { TrinoSQL } from 'src/parser/trino';
|
||||
import { TrinoSqlListener } from 'src/lib/trino/TrinoSqlListener';
|
||||
import { ParseTreeListener } from 'antlr4ng';
|
||||
|
||||
describe('trino SQL Listener Tests', () => {
|
||||
const expectTableName = 'user1';
|
||||
@ -10,20 +9,16 @@ describe('trino SQL Listener Tests', () => {
|
||||
const parseTree = trino.parse(sql);
|
||||
|
||||
test('Listener enterTableName', async () => {
|
||||
let result = '';
|
||||
class MyListener implements TrinoSqlListener {
|
||||
class MyListener extends TrinoSqlListener {
|
||||
result = '';
|
||||
enterTableName = (ctx): void => {
|
||||
result = ctx.getText().toLowerCase();
|
||||
this.result = ctx.getText().toLowerCase();
|
||||
};
|
||||
visitTerminal() {}
|
||||
visitErrorNode() {}
|
||||
enterEveryRule() {}
|
||||
exitEveryRule() {}
|
||||
}
|
||||
const listenTableName = new MyListener();
|
||||
const listener = new MyListener();
|
||||
|
||||
await trino.listen(listenTableName as ParseTreeListener, parseTree);
|
||||
expect(result).toBe(expectTableName);
|
||||
trino.listen(listener, parseTree);
|
||||
expect(listener.result).toBe(expectTableName);
|
||||
});
|
||||
|
||||
test('Split sql listener', async () => {
|
||||
|
@ -1,6 +1,5 @@
|
||||
import { TrinoSQL } from 'src/parser/trino';
|
||||
import { TrinoSqlVisitor } from 'src/lib/trino/TrinoSqlVisitor';
|
||||
import { AbstractParseTreeVisitor } from 'antlr4ng';
|
||||
|
||||
describe('trino SQL Visitor Tests', () => {
|
||||
const expectTableName = 'user1';
|
||||
@ -12,17 +11,22 @@ describe('trino SQL Visitor Tests', () => {
|
||||
});
|
||||
|
||||
test('Visitor visitTableName', () => {
|
||||
let result = '';
|
||||
class MyVisitor extends AbstractParseTreeVisitor<any> implements TrinoSqlVisitor<any> {
|
||||
protected defaultResult() {
|
||||
return result;
|
||||
class MyVisitor extends TrinoSqlVisitor<string> {
|
||||
defaultResult(): string {
|
||||
return '';
|
||||
}
|
||||
visitTableName = (ctx): void => {
|
||||
result = ctx.getText().toLowerCase();
|
||||
aggregateResult(aggregate: string, nextResult: string): string {
|
||||
return aggregate + nextResult;
|
||||
}
|
||||
visitProgram = (ctx) => {
|
||||
return this.visitChildren(ctx);
|
||||
};
|
||||
visitTableName = (ctx) => {
|
||||
return ctx.getText().toLowerCase();
|
||||
};
|
||||
}
|
||||
const visitor: any = new MyVisitor();
|
||||
visitor.visit(parseTree);
|
||||
const visitor = new MyVisitor();
|
||||
const result = visitor.visit(parseTree);
|
||||
|
||||
expect(result).toBe(expectTableName);
|
||||
});
|
||||
|
@ -3,6 +3,13 @@
|
||||
"compilerOptions": {
|
||||
"baseUrl": "../",
|
||||
"noEmit": true,
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"strictNullChecks": false,
|
||||
"noUnusedLocals": true,
|
||||
"noImplicitAny": false,
|
||||
"noImplicitOverride": false,
|
||||
"noImplicitReturns": true,
|
||||
"noImplicitThis": true,
|
||||
"paths": {
|
||||
"src/*": ["src/*"],
|
||||
"test/*": ["test/*"]
|
||||
|
Reference in New Issue
Block a user