UNPKG

dt-sql-parser

Version:

SQL Parsers for BigData, built with antlr4

112 lines (111 loc) 4.6 kB
import { processTokenCandidates } from '../common/tokenUtils'; import { MySqlLexer } from '../../lib/mysql/MySqlLexer'; import { MySqlParser } from '../../lib/mysql/MySqlParser'; import { BasicSQL } from '../common/basicSQL'; import { EntityContextType, } from '../common/types'; import { MySqlEntityCollector } from './mysqlEntityCollector'; import { MysqlErrorListener } from './mysqlErrorListener'; import { MysqlSplitListener } from './mysqlSplitListener'; import { MySqlSemanticContextCollector } from '../mysql/mysqlSemanticContextCollector'; export { MySqlEntityCollector, MysqlSplitListener }; export class MySQL extends BasicSQL { constructor() { super(...arguments); this.preferredRules = new Set([ MySqlParser.RULE_databaseName, MySqlParser.RULE_databaseNameCreate, MySqlParser.RULE_tableName, MySqlParser.RULE_tableNameCreate, MySqlParser.RULE_viewName, MySqlParser.RULE_viewNameCreate, MySqlParser.RULE_functionName, MySqlParser.RULE_functionNameCreate, MySqlParser.RULE_columnName, MySqlParser.RULE_columnNameCreate, ]); } createLexerFromCharStream(charStreams) { return new MySqlLexer(charStreams); } createParserFromTokenStream(tokenStream) { return new MySqlParser(tokenStream); } get splitListener() { return new MysqlSplitListener(); } createErrorListener(_errorListener) { const parserContext = this; return new MysqlErrorListener(_errorListener, parserContext, this.preferredRules); } createEntityCollector(input, allTokens, caretTokenIndex) { return new MySqlEntityCollector(input, allTokens, caretTokenIndex); } createSemanticContextCollector(input, caretPosition, allTokens, options) { return new MySqlSemanticContextCollector(input, caretPosition, allTokens, options); } processCandidates(candidates, allTokens, caretTokenIndex) { const originalSyntaxSuggestions = []; const keywords = []; for (const candidate of candidates.rules) { const [ruleType, candidateRule] = candidate; const tokenRanges = allTokens.slice(candidateRule.startTokenIndex, caretTokenIndex + 1); let syntaxContextType = void 0; switch (ruleType) { case MySqlParser.RULE_databaseName: { syntaxContextType = EntityContextType.DATABASE; break; } case MySqlParser.RULE_databaseNameCreate: { syntaxContextType = EntityContextType.DATABASE_CREATE; break; } case MySqlParser.RULE_tableName: { syntaxContextType = EntityContextType.TABLE; break; } case MySqlParser.RULE_tableNameCreate: { syntaxContextType = EntityContextType.TABLE_CREATE; break; } case MySqlParser.RULE_viewName: { syntaxContextType = EntityContextType.VIEW; break; } case MySqlParser.RULE_viewNameCreate: { syntaxContextType = EntityContextType.VIEW_CREATE; break; } case MySqlParser.RULE_functionName: { syntaxContextType = EntityContextType.FUNCTION; break; } case MySqlParser.RULE_functionNameCreate: { syntaxContextType = EntityContextType.FUNCTION_CREATE; break; } case MySqlParser.RULE_columnName: { syntaxContextType = EntityContextType.COLUMN; break; } case MySqlParser.RULE_columnNameCreate: { syntaxContextType = EntityContextType.COLUMN_CREATE; break; } default: break; } if (syntaxContextType) { originalSyntaxSuggestions.push({ syntaxContextType, wordRanges: tokenRanges, }); } } const processedKeywords = processTokenCandidates(this._parser, candidates.tokens); keywords.push(...processedKeywords); return { syntax: originalSyntaxSuggestions, keywords, }; } }