Skip to content
Prev Previous commit
Next Next commit
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.
  • Loading branch information
the21st committed Mar 16, 2023
commit 221a70b0aa67851e1a83341e18081cdd39f72a79
38 changes: 38 additions & 0 deletions packages/server/src/complete/candidates/createColumnCandidates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,41 @@ export function createCandidatesForScopedColumns(
.filter((item) => item.matchesLastToken())
.map((item) => item.toCompletionItem())
}

export function createCandidatesForUnscopedColumns(
fromNodes: FromTableNode[],
tables: Table[],
lastToken: string
): CompletionItem[] {
return tables
.flatMap((table) => {
if (fromNodes.length === 0) {
return table.columns.map((col) => {
return new Identifier(
lastToken,
makeColumnName('', col.columnName),
col.description,
ICONS.COLUMN
)
})
}
return fromNodes
.filter((fromNode) => isTableMatch(fromNode, table))
.map(getAliasFromFromTableNode)
.flatMap((alias) => {
return table.columns.map((col) => {
return new Identifier(
lastToken,
makeColumnName(
alias === table.tableName ? '' : alias,
col.columnName
),
col.description,
ICONS.COLUMN
)
})
})
})
.filter((item) => item.matchesLastToken())
.map((item) => item.toCompletionItem())
}
14 changes: 13 additions & 1 deletion packages/server/src/complete/complete.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import { createJoinCondidates } from './candidates/createJoinCandidates'
import {
createCandidatesForColumnsOfAnyTable,
createCandidatesForScopedColumns,
createCandidatesForUnscopedColumns,
} from './candidates/createColumnCandidates'
import { createAliasCandidates } from './candidates/createAliasCandidates'
import { createSelectAllColumnsCandidates } from './candidates/createSelectAllColumnsCandidates'
Expand Down Expand Up @@ -316,7 +317,8 @@ class Completer {
this.addCandidatesForScopedColumns(fromNodes, schemaAndSubqueries)
} else {
// Column is not scoped to a table/alias yet
// Could be an alias, a talbe or a function
// Could be an alias or an unscoped column
this.addCandidatesForUnscopedColumns(fromNodes, schemaAndSubqueries)
this.addCandidatesForAliases(fromNodes)
this.addCandidatesForTables(schemaAndSubqueries, true)
this.addCandidatesForFunctions()
Expand Down Expand Up @@ -385,6 +387,16 @@ class Completer {
console.timeEnd('addCandidatesForScopedColumns')
}

addCandidatesForUnscopedColumns(fromNodes: FromTableNode[], tables: Table[]) {
createCandidatesForUnscopedColumns(
fromNodes,
tables,
this.lastToken
).forEach((v) => {
this.addCandidate(v)
})
}

addCandidatesForAliases(fromNodes: FromTableNode[]) {
createAliasCandidates(fromNodes, this.lastToken).forEach((v) => {
this.addCandidate(v)
Expand Down