diff --git a/packages/server/src/complete/Identifier.ts b/packages/server/src/complete/Identifier.ts index 8ba356f1..26333313 100644 --- a/packages/server/src/complete/Identifier.ts +++ b/packages/server/src/complete/Identifier.ts @@ -47,7 +47,7 @@ export class Identifier { let tableName = label const i = tableName.lastIndexOf('.') if (i > 0) { - tableName = label.substr(i + 1) + tableName = label.substring(i + 1) } tableAlias = makeTableAlias(tableName) kindName = 'table' diff --git a/packages/server/src/complete/StringUtils.ts b/packages/server/src/complete/StringUtils.ts index 92143eb4..484de348 100644 --- a/packages/server/src/complete/StringUtils.ts +++ b/packages/server/src/complete/StringUtils.ts @@ -17,21 +17,6 @@ export function getRidOfAfterPosString(sql: string, pos: Pos): string { .join('\n') } -// Gets the last token from the given string considering that tokens can contain dots. -export function getLastToken(sql: string): string { - const match = sql.match(/^(?:.|\s)*[^A-z0-9\\.:'](.*?)$/) - if (match) { - let prevToken = '' - let currentToken = match[1] - while (currentToken != prevToken) { - prevToken = currentToken - currentToken = prevToken.replace(/\[.*?\]/, '') - } - return currentToken - } - return sql -} - export function makeTableName(table: Table): string { if (table.catalog) { return table.catalog + '.' + table.database + '.' + table.tableName diff --git a/packages/server/src/complete/complete.ts b/packages/server/src/complete/complete.ts index e819c408..5196308f 100644 --- a/packages/server/src/complete/complete.ts +++ b/packages/server/src/complete/complete.ts @@ -13,7 +13,8 @@ import { import log4js from 'log4js' import { CompletionItem } from 'vscode-languageserver-types' import { Schema, Table } from '../database_libs/AbstractClient' -import { getRidOfAfterPosString, getLastToken } from './StringUtils' +import { getRidOfAfterPosString } from './StringUtils' +import { getLastToken } from './utils/getLastToken' import { isPosInLocation, createTablesFromFromNodes, diff --git a/packages/server/src/complete/utils/getLastToken.ts b/packages/server/src/complete/utils/getLastToken.ts new file mode 100644 index 00000000..94f291ef --- /dev/null +++ b/packages/server/src/complete/utils/getLastToken.ts @@ -0,0 +1,14 @@ +// Gets the last token from the given string considering that tokens can contain dots. +export function getLastToken(sql: string): string { + const match = sql.match(/^(?:.|\s)*[^A-z0-9\\.:'"](.*?)$/) + if (match) { + let prevToken = '' + let currentToken = match[1] + while (currentToken !== prevToken) { + prevToken = currentToken + currentToken = prevToken.replace(/\[.*?\]/, '') // remove [] + } + return currentToken.replace(/"/g, '') // remove "" + } + return sql +} diff --git a/packages/server/test/complete/StringUtils.test.ts b/packages/server/test/complete/StringUtils.test.ts deleted file mode 100644 index 30d3b7b0..00000000 --- a/packages/server/test/complete/StringUtils.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -import * as StringUtils from '../../src/complete/StringUtils' -describe('StringUtils', () => { - test('getLastToken', () => { - expect(StringUtils.getLastToken('SELECT abc')).toEqual('abc') - expect(StringUtils.getLastToken('SELECT abc.def')).toEqual('abc.def') - expect(StringUtils.getLastToken('SELECT abc[0]')).toEqual('abc') - expect(StringUtils.getLastToken('SELECT abc[0].')).toEqual('abc.') - expect(StringUtils.getLastToken('SELECT abc[0].d')).toEqual('abc.d') - expect(StringUtils.getLastToken('SELECT abc[0].def[0]')).toEqual('abc.def') - expect(StringUtils.getLastToken('SELECT abc[0].def[0].')).toEqual( - 'abc.def.' - ) - expect(StringUtils.getLastToken('SELECT abc[0].def[0].g')).toEqual( - 'abc.def.g' - ) - - expect(StringUtils.getLastToken("SELECT abc['key']")).toEqual('abc') - expect(StringUtils.getLastToken("SELECT abc['key.name'].")).toEqual('abc.') - expect(StringUtils.getLastToken("SELECT abc['key'].d")).toEqual('abc.d') - expect(StringUtils.getLastToken("SELECT abc['key'].def['key']")).toEqual( - 'abc.def' - ) - expect(StringUtils.getLastToken("SELECT abc['key'].def['key'].")).toEqual( - 'abc.def.' - ) - expect(StringUtils.getLastToken("SELECT abc['key'].def[0].g")).toEqual( - 'abc.def.g' - ) - }) -}) diff --git a/packages/server/test/complete/complete_column.test.ts b/packages/server/test/complete/complete_column.test.ts index 52a5b9c5..9781f9fd 100644 --- a/packages/server/test/complete/complete_column.test.ts +++ b/packages/server/test/complete/complete_column.test.ts @@ -123,8 +123,7 @@ describe('ColumnName completion', () => { expect(result.candidates.length).toEqual(0) }) - // TODO: Implement completion - test.skip('complete ColumnName with back quoted table', () => { + test('complete ColumnName with back quoted table', () => { const result = complete( 'SELECT "TABLE1". FROM "TABLE1"', { line: 0, column: 16 }, diff --git a/packages/server/test/complete/utils/getLastToken.test.ts b/packages/server/test/complete/utils/getLastToken.test.ts new file mode 100644 index 00000000..15f05f8e --- /dev/null +++ b/packages/server/test/complete/utils/getLastToken.test.ts @@ -0,0 +1,22 @@ +import { getLastToken } from '../../../src/complete/utils/getLastToken' + +describe('getLastToken', () => { + test('getLastToken', () => { + expect(getLastToken('SELECT abc')).toEqual('abc') + expect(getLastToken('SELECT abc.def')).toEqual('abc.def') + expect(getLastToken('SELECT abc[0]')).toEqual('abc') + expect(getLastToken('SELECT abc[0].')).toEqual('abc.') + expect(getLastToken('SELECT abc[0].d')).toEqual('abc.d') + expect(getLastToken('SELECT abc[0].def[0]')).toEqual('abc.def') + expect(getLastToken('SELECT abc[0].def[0].')).toEqual('abc.def.') + expect(getLastToken('SELECT abc[0].def[0].g')).toEqual('abc.def.g') + + expect(getLastToken("SELECT abc['key']")).toEqual('abc') + expect(getLastToken("SELECT abc['key.name'].")).toEqual('abc.') + expect(getLastToken("SELECT abc['key'].d")).toEqual('abc.d') + expect(getLastToken("SELECT abc['key'].def['key']")).toEqual('abc.def') + expect(getLastToken("SELECT abc['key'].def['key'].")).toEqual('abc.def.') + expect(getLastToken("SELECT abc['key'].def[0].g")).toEqual('abc.def.g') + expect(getLastToken('SELECT "abc"')).toEqual('abc') + }) +})