Cleanup following bigint fixes.
This commit is contained in:
parent
2c8c80a086
commit
b17c6ab43a
|
@ -284,13 +284,13 @@ class InternalBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
private generateSelectStatement(): (string | Knex.Raw)[] | "*" {
|
private generateSelectStatement(): (string | Knex.Raw)[] | "*" {
|
||||||
const { endpoint, resource } = this.query
|
const { table, resource } = this.query
|
||||||
|
|
||||||
if (!resource || !resource.fields || resource.fields.length === 0) {
|
if (!resource || !resource.fields || resource.fields.length === 0) {
|
||||||
return "*"
|
return "*"
|
||||||
}
|
}
|
||||||
|
|
||||||
const alias = this.getTableName(endpoint.entityId)
|
const alias = this.getTableName(table)
|
||||||
const schema = this.table.schema
|
const schema = this.table.schema
|
||||||
if (!this.isFullSelectStatementRequired()) {
|
if (!this.isFullSelectStatementRequired()) {
|
||||||
return [this.knex.raw("??", [`${alias}.*`])]
|
return [this.knex.raw("??", [`${alias}.*`])]
|
||||||
|
@ -496,7 +496,7 @@ class InternalBuilder {
|
||||||
filterKey: string,
|
filterKey: string,
|
||||||
whereCb: (filterKey: string, query: Knex.QueryBuilder) => Knex.QueryBuilder
|
whereCb: (filterKey: string, query: Knex.QueryBuilder) => Knex.QueryBuilder
|
||||||
): Knex.QueryBuilder {
|
): Knex.QueryBuilder {
|
||||||
const { relationships, endpoint, tableAliases: aliases, table } = this.query
|
const { relationships, schema, tableAliases: aliases, table } = this.query
|
||||||
const fromAlias = aliases?.[table.name] || table.name
|
const fromAlias = aliases?.[table.name] || table.name
|
||||||
const matches = (value: string) =>
|
const matches = (value: string) =>
|
||||||
filterKey.match(new RegExp(`^${value}\\.`))
|
filterKey.match(new RegExp(`^${value}\\.`))
|
||||||
|
@ -537,7 +537,7 @@ class InternalBuilder {
|
||||||
aliases?.[manyToMany.through] || relationship.through
|
aliases?.[manyToMany.through] || relationship.through
|
||||||
let throughTable = this.tableNameWithSchema(manyToMany.through, {
|
let throughTable = this.tableNameWithSchema(manyToMany.through, {
|
||||||
alias: throughAlias,
|
alias: throughAlias,
|
||||||
schema: endpoint.schema,
|
schema,
|
||||||
})
|
})
|
||||||
subQuery = subQuery
|
subQuery = subQuery
|
||||||
// add a join through the junction table
|
// add a join through the junction table
|
||||||
|
@ -1010,28 +1010,10 @@ class InternalBuilder {
|
||||||
return isSqs(this.table)
|
return isSqs(this.table)
|
||||||
}
|
}
|
||||||
|
|
||||||
getTableName(tableOrName?: Table | string): string {
|
getTableName(table?: Table): string {
|
||||||
let table: Table
|
if (!table) {
|
||||||
if (typeof tableOrName === "string") {
|
|
||||||
const name = tableOrName
|
|
||||||
if (this.query.table?.name === name) {
|
|
||||||
table = this.query.table
|
|
||||||
} else if (this.query.table.name === name) {
|
|
||||||
table = this.query.table
|
|
||||||
} else if (!this.query.tables[name]) {
|
|
||||||
// This can legitimately happen in custom queries, where the user is
|
|
||||||
// querying against a table that may not have been imported into
|
|
||||||
// Budibase.
|
|
||||||
return name
|
|
||||||
} else {
|
|
||||||
table = this.query.tables[name]
|
|
||||||
}
|
|
||||||
} else if (tableOrName) {
|
|
||||||
table = tableOrName
|
|
||||||
} else {
|
|
||||||
table = this.table
|
table = this.table
|
||||||
}
|
}
|
||||||
|
|
||||||
let name = table.name
|
let name = table.name
|
||||||
if (isSqs(table) && table._id) {
|
if (isSqs(table) && table._id) {
|
||||||
// SQS uses the table ID rather than the table name
|
// SQS uses the table ID rather than the table name
|
||||||
|
@ -1242,7 +1224,7 @@ class InternalBuilder {
|
||||||
): Knex.QueryBuilder {
|
): Knex.QueryBuilder {
|
||||||
const sqlClient = this.client
|
const sqlClient = this.client
|
||||||
const knex = this.knex
|
const knex = this.knex
|
||||||
const { resource, tableAliases: aliases, endpoint, tables } = this.query
|
const { resource, tableAliases: aliases, schema, tables } = this.query
|
||||||
const fields = resource?.fields || []
|
const fields = resource?.fields || []
|
||||||
for (let relationship of relationships) {
|
for (let relationship of relationships) {
|
||||||
const {
|
const {
|
||||||
|
@ -1266,7 +1248,7 @@ class InternalBuilder {
|
||||||
throughAlias = (throughTable && aliases?.[throughTable]) || throughTable
|
throughAlias = (throughTable && aliases?.[throughTable]) || throughTable
|
||||||
let toTableWithSchema = this.tableNameWithSchema(toTable, {
|
let toTableWithSchema = this.tableNameWithSchema(toTable, {
|
||||||
alias: toAlias,
|
alias: toAlias,
|
||||||
schema: endpoint.schema,
|
schema,
|
||||||
})
|
})
|
||||||
const requiredFields = [
|
const requiredFields = [
|
||||||
...(relatedTable?.primary || []),
|
...(relatedTable?.primary || []),
|
||||||
|
@ -1310,7 +1292,7 @@ class InternalBuilder {
|
||||||
if (isManyToMany) {
|
if (isManyToMany) {
|
||||||
let throughTableWithSchema = this.tableNameWithSchema(throughTable, {
|
let throughTableWithSchema = this.tableNameWithSchema(throughTable, {
|
||||||
alias: throughAlias,
|
alias: throughAlias,
|
||||||
schema: endpoint.schema,
|
schema,
|
||||||
})
|
})
|
||||||
subQuery = subQuery.join(throughTableWithSchema, function () {
|
subQuery = subQuery.join(throughTableWithSchema, function () {
|
||||||
this.on(`${toAlias}.${toPrimary}`, "=", `${throughAlias}.${toKey}`)
|
this.on(`${toAlias}.${toPrimary}`, "=", `${throughAlias}.${toKey}`)
|
||||||
|
@ -1401,8 +1383,7 @@ class InternalBuilder {
|
||||||
toPrimary?: string
|
toPrimary?: string
|
||||||
}[]
|
}[]
|
||||||
): Knex.QueryBuilder {
|
): Knex.QueryBuilder {
|
||||||
const { tableAliases: aliases, endpoint } = this.query
|
const { tableAliases: aliases, schema } = this.query
|
||||||
const schema = endpoint.schema
|
|
||||||
const toTable = tables.to,
|
const toTable = tables.to,
|
||||||
fromTable = tables.from,
|
fromTable = tables.from,
|
||||||
throughTable = tables.through
|
throughTable = tables.through
|
||||||
|
@ -1462,7 +1443,7 @@ class InternalBuilder {
|
||||||
return this.knex(
|
return this.knex(
|
||||||
this.tableNameWithSchema(this.query.table.name, {
|
this.tableNameWithSchema(this.query.table.name, {
|
||||||
alias,
|
alias,
|
||||||
schema: this.query.endpoint.schema,
|
schema: this.query.schema,
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -1556,9 +1537,8 @@ class InternalBuilder {
|
||||||
limits?: { base: number; query: number }
|
limits?: { base: number; query: number }
|
||||||
} = {}
|
} = {}
|
||||||
): Knex.QueryBuilder {
|
): Knex.QueryBuilder {
|
||||||
let { endpoint, filters, paginate, relationships, table } = this.query
|
let { operation, filters, paginate, relationships, table } = this.query
|
||||||
const { limits } = opts
|
const { limits } = opts
|
||||||
const counting = endpoint.operation === Operation.COUNT
|
|
||||||
|
|
||||||
// start building the query
|
// start building the query
|
||||||
let query = this.qualifiedKnex()
|
let query = this.qualifiedKnex()
|
||||||
|
@ -1578,7 +1558,7 @@ class InternalBuilder {
|
||||||
foundLimit = paginate.limit
|
foundLimit = paginate.limit
|
||||||
}
|
}
|
||||||
// counting should not sort, limit or offset
|
// counting should not sort, limit or offset
|
||||||
if (!counting) {
|
if (operation !== Operation.COUNT) {
|
||||||
// add the found limit if supplied
|
// add the found limit if supplied
|
||||||
if (foundLimit != null) {
|
if (foundLimit != null) {
|
||||||
query = query.limit(foundLimit)
|
query = query.limit(foundLimit)
|
||||||
|
@ -1590,7 +1570,7 @@ class InternalBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
const aggregations = this.query.resource?.aggregations || []
|
const aggregations = this.query.resource?.aggregations || []
|
||||||
if (counting) {
|
if (operation === Operation.COUNT) {
|
||||||
query = this.addDistinctCount(query)
|
query = this.addDistinctCount(query)
|
||||||
} else if (aggregations.length > 0) {
|
} else if (aggregations.length > 0) {
|
||||||
query = this.addAggregations(query, aggregations)
|
query = this.addAggregations(query, aggregations)
|
||||||
|
@ -1599,7 +1579,7 @@ class InternalBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
// have to add after as well (this breaks MS-SQL)
|
// have to add after as well (this breaks MS-SQL)
|
||||||
if (!counting) {
|
if (operation !== Operation.COUNT) {
|
||||||
query = this.addSorting(query)
|
query = this.addSorting(query)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1738,13 +1718,11 @@ class SqlQueryBuilder extends SqlTableQueryBuilder {
|
||||||
return {}
|
return {}
|
||||||
}
|
}
|
||||||
const input = this._query({
|
const input = this._query({
|
||||||
|
operation: Operation.READ,
|
||||||
datasource: json.datasource,
|
datasource: json.datasource,
|
||||||
|
schema: json.schema,
|
||||||
table: json.table,
|
table: json.table,
|
||||||
tables: json.tables,
|
tables: json.tables,
|
||||||
endpoint: {
|
|
||||||
...json.endpoint,
|
|
||||||
operation: Operation.READ,
|
|
||||||
},
|
|
||||||
resource: { fields: [] },
|
resource: { fields: [] },
|
||||||
filters: json.extra?.idFilter,
|
filters: json.extra?.idFilter,
|
||||||
paginate: { limit: 1 },
|
paginate: { limit: 1 },
|
||||||
|
|
|
@ -239,14 +239,13 @@ class SqlTableQueryBuilder {
|
||||||
* @return the operation that was found in the JSON.
|
* @return the operation that was found in the JSON.
|
||||||
*/
|
*/
|
||||||
_operation(json: EnrichedQueryJson): Operation {
|
_operation(json: EnrichedQueryJson): Operation {
|
||||||
return json.endpoint.operation
|
return json.operation
|
||||||
}
|
}
|
||||||
|
|
||||||
_tableQuery(json: EnrichedQueryJson): SqlQuery | SqlQuery[] {
|
_tableQuery(json: EnrichedQueryJson): SqlQuery | SqlQuery[] {
|
||||||
let client = knex({ client: this.sqlClient }).schema
|
let client = knex({ client: this.sqlClient }).schema
|
||||||
let schemaName = json?.endpoint?.schema
|
if (json?.schema) {
|
||||||
if (schemaName) {
|
client = client.withSchema(json.schema)
|
||||||
client = client.withSchema(schemaName)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let query: Knex.SchemaBuilder
|
let query: Knex.SchemaBuilder
|
||||||
|
@ -268,8 +267,8 @@ class SqlTableQueryBuilder {
|
||||||
// renameColumn does not work for MySQL, so return a raw query
|
// renameColumn does not work for MySQL, so return a raw query
|
||||||
if (this.sqlClient === SqlClient.MY_SQL && json.meta?.renamed) {
|
if (this.sqlClient === SqlClient.MY_SQL && json.meta?.renamed) {
|
||||||
const updatedColumn = json.meta.renamed.updated
|
const updatedColumn = json.meta.renamed.updated
|
||||||
const tableName = schemaName
|
const tableName = json?.schema
|
||||||
? `\`${schemaName}\`.\`${json.table.name}\``
|
? `\`${json.schema}\`.\`${json.table.name}\``
|
||||||
: `\`${json.table.name}\``
|
: `\`${json.table.name}\``
|
||||||
return {
|
return {
|
||||||
sql: `alter table ${tableName} rename column \`${json.meta.renamed.old}\` to \`${updatedColumn}\`;`,
|
sql: `alter table ${tableName} rename column \`${json.meta.renamed.old}\` to \`${updatedColumn}\`;`,
|
||||||
|
@ -290,8 +289,8 @@ class SqlTableQueryBuilder {
|
||||||
if (this.sqlClient === SqlClient.MS_SQL && json.meta?.renamed) {
|
if (this.sqlClient === SqlClient.MS_SQL && json.meta?.renamed) {
|
||||||
const oldColumn = json.meta.renamed.old
|
const oldColumn = json.meta.renamed.old
|
||||||
const updatedColumn = json.meta.renamed.updated
|
const updatedColumn = json.meta.renamed.updated
|
||||||
const tableName = schemaName
|
const tableName = json?.schema
|
||||||
? `${schemaName}.${json.table.name}`
|
? `${json.schema}.${json.table.name}`
|
||||||
: `${json.table.name}`
|
: `${json.table.name}`
|
||||||
const sql = getNativeSql(query)
|
const sql = getNativeSql(query)
|
||||||
if (Array.isArray(sql)) {
|
if (Array.isArray(sql)) {
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 6f38253253ee364aea636add990083ca5cda3bde
|
Subproject commit 49265a7430c590968ba65890a91dd398e5312941
|
|
@ -383,7 +383,7 @@ export class GoogleSheetsIntegration implements DatasourcePlus {
|
||||||
|
|
||||||
async query(json: EnrichedQueryJson): Promise<DatasourcePlusQueryResponse> {
|
async query(json: EnrichedQueryJson): Promise<DatasourcePlusQueryResponse> {
|
||||||
const sheet = json.table.name
|
const sheet = json.table.name
|
||||||
switch (json.endpoint.operation) {
|
switch (json.operation) {
|
||||||
case Operation.CREATE:
|
case Operation.CREATE:
|
||||||
return this.create({ sheet, row: json.body as Row })
|
return this.create({ sheet, row: json.body as Row })
|
||||||
case Operation.BULK_CREATE:
|
case Operation.BULK_CREATE:
|
||||||
|
@ -426,7 +426,7 @@ export class GoogleSheetsIntegration implements DatasourcePlus {
|
||||||
return this.deleteTable(json?.table?.name)
|
return this.deleteTable(json?.table?.name)
|
||||||
default:
|
default:
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`GSheets integration does not support "${json.endpoint.operation}".`
|
`GSheets integration does not support "${json.operation}".`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -231,7 +231,7 @@ async function runSqlQuery(
|
||||||
tables.map(table => table._id!).concat(relationshipJunctionTableIds)
|
tables.map(table => table._id!).concat(relationshipJunctionTableIds)
|
||||||
)
|
)
|
||||||
if (opts?.countTotalRows) {
|
if (opts?.countTotalRows) {
|
||||||
json.endpoint.operation = Operation.COUNT
|
json.operation = Operation.COUNT
|
||||||
}
|
}
|
||||||
const processSQLQuery = async (json: EnrichedQueryJson) => {
|
const processSQLQuery = async (json: EnrichedQueryJson) => {
|
||||||
const query = builder._query(json, {
|
const query = builder._query(json, {
|
||||||
|
|
|
@ -3,7 +3,6 @@ import {
|
||||||
DatasourcePlusQueryResponse,
|
DatasourcePlusQueryResponse,
|
||||||
EnrichedQueryJson,
|
EnrichedQueryJson,
|
||||||
Operation,
|
Operation,
|
||||||
QueryJson,
|
|
||||||
Row,
|
Row,
|
||||||
SearchFilters,
|
SearchFilters,
|
||||||
SqlClient,
|
SqlClient,
|
||||||
|
@ -69,13 +68,12 @@ export default class AliasTables {
|
||||||
this.charSeq = new CharSequence()
|
this.charSeq = new CharSequence()
|
||||||
}
|
}
|
||||||
|
|
||||||
isAliasingEnabled(json: QueryJson, datasource?: Datasource) {
|
isAliasingEnabled(json: EnrichedQueryJson, datasource?: Datasource) {
|
||||||
const operation = json.endpoint.operation
|
|
||||||
const fieldLength = json.resource?.fields?.length
|
const fieldLength = json.resource?.fields?.length
|
||||||
if (
|
if (
|
||||||
!fieldLength ||
|
!fieldLength ||
|
||||||
fieldLength <= 0 ||
|
fieldLength <= 0 ||
|
||||||
DISABLED_OPERATIONS.includes(operation)
|
DISABLED_OPERATIONS.includes(json.operation)
|
||||||
) {
|
) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -85,7 +83,7 @@ export default class AliasTables {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const sqlClient = getSQLClient(datasource)
|
const sqlClient = getSQLClient(datasource)
|
||||||
const isWrite = WRITE_OPERATIONS.includes(operation)
|
const isWrite = WRITE_OPERATIONS.includes(json.operation)
|
||||||
const isDisabledClient = DISABLED_WRITE_CLIENTS.includes(sqlClient)
|
const isDisabledClient = DISABLED_WRITE_CLIENTS.includes(sqlClient)
|
||||||
if (isWrite && isDisabledClient) {
|
if (isWrite && isDisabledClient) {
|
||||||
return false
|
return false
|
||||||
|
|
|
@ -118,9 +118,11 @@ export async function enrichQueryJson(
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
operation: json.endpoint.operation,
|
||||||
table,
|
table,
|
||||||
tables,
|
tables,
|
||||||
datasource,
|
datasource,
|
||||||
|
schema: json.endpoint.schema,
|
||||||
...json,
|
...json,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -184,14 +184,12 @@ export interface QueryJson {
|
||||||
tableAliases?: Record<string, string>
|
tableAliases?: Record<string, string>
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface EnrichedQueryJson extends QueryJson {
|
export interface EnrichedQueryJson extends Omit<QueryJson, "endpoint"> {
|
||||||
|
operation: Operation
|
||||||
table: Table
|
table: Table
|
||||||
tables: Record<string, Table>
|
tables: Record<string, Table>
|
||||||
datasource?: Datasource
|
datasource?: Datasource
|
||||||
}
|
schema?: string
|
||||||
|
|
||||||
export interface QueryJsonRequest extends Omit<QueryJson, "endpoint"> {
|
|
||||||
endpoint: QueryJson["endpoint"] & { datasourceId: string; entityId: string }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface QueryOptions {
|
export interface QueryOptions {
|
||||||
|
|
Loading…
Reference in New Issue