Skip to content

Commit 9c5769b

Browse files
committed
Add suggestion for unscoped columns
When there is a table specified in the FROM clause, only suggest unscoped columns from that table. If no table is specified, suggest all columns from all tables.
1 parent f08b557 commit 9c5769b

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

packages/server/src/complete/candidates/createColumnCandidates.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,41 @@ export function createCandidatesForScopedColumns(
4949
.filter((item) => item.matchesLastToken())
5050
.map((item) => item.toCompletionItem())
5151
}
52+
53+
export function createCandidatesForUnscopedColumns(
54+
fromNodes: FromTableNode[],
55+
tables: Table[],
56+
lastToken: string
57+
): CompletionItem[] {
58+
return tables
59+
.flatMap((table) => {
60+
if (fromNodes.length === 0) {
61+
return table.columns.map((col) => {
62+
return new Identifier(
63+
lastToken,
64+
makeColumnName('', col.columnName),
65+
col.description,
66+
ICONS.COLUMN
67+
)
68+
})
69+
}
70+
return fromNodes
71+
.filter((fromNode) => isTableMatch(fromNode, table))
72+
.map(getAliasFromFromTableNode)
73+
.flatMap((alias) => {
74+
return table.columns.map((col) => {
75+
return new Identifier(
76+
lastToken,
77+
makeColumnName(
78+
alias === table.tableName ? '' : alias,
79+
col.columnName
80+
),
81+
col.description,
82+
ICONS.COLUMN
83+
)
84+
})
85+
})
86+
})
87+
.filter((item) => item.matchesLastToken())
88+
.map((item) => item.toCompletionItem())
89+
}

packages/server/src/complete/complete.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import { createJoinCondidates } from './candidates/createJoinCandidates'
3030
import {
3131
createCandidatesForColumnsOfAnyTable,
3232
createCandidatesForScopedColumns,
33+
createCandidatesForUnscopedColumns,
3334
} from './candidates/createColumnCandidates'
3435
import { createAliasCandidates } from './candidates/createAliasCandidates'
3536
import { createSelectAllColumnsCandidates } from './candidates/createSelectAllColumnsCandidates'
@@ -323,7 +324,8 @@ class Completer {
323324
this.addCandidatesForScopedColumns(fromNodes, schemaAndSubqueries)
324325
} else {
325326
// Column is not scoped to a table/alias yet
326-
// Could be an alias, a talbe or a function
327+
// Could be an alias or an unscoped column
328+
this.addCandidatesForUnscopedColumns(fromNodes, schemaAndSubqueries)
327329
this.addCandidatesForAliases(fromNodes)
328330
this.addCandidatesForTables(schemaAndSubqueries, true)
329331
this.addCandidatesForFunctions()
@@ -394,6 +396,16 @@ class Completer {
394396
console.timeEnd('addCandidatesForScopedColumns')
395397
}
396398

399+
addCandidatesForUnscopedColumns(fromNodes: FromTableNode[], tables: Table[]) {
400+
createCandidatesForUnscopedColumns(
401+
fromNodes,
402+
tables,
403+
this.lastToken
404+
).forEach((v) => {
405+
this.addCandidate(v)
406+
})
407+
}
408+
397409
addCandidatesForAliases(fromNodes: FromTableNode[]) {
398410
createAliasCandidates(fromNodes, this.lastToken).forEach((v) => {
399411
this.addCandidate(v)

0 commit comments

Comments
 (0)