Browse Source

refactor: validate formula only if error occurred (WIP)

Signed-off-by: Pranav C <pranavxc@gmail.com>
test/query-opt-imp
Pranav C 1 year ago
parent
commit
fc7e69d1e1
  1. 34
      packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts
  2. 3
      packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/formulav2/formulaQueryBuilderv2.ts

34
packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts

@ -58,6 +58,7 @@ const nanoidv2 = customAlphabet('1234567890abcdefghijklmnopqrstuvwxyz', 14);
const { v4: uuidv4 } = require('uuid'); const { v4: uuidv4 } = require('uuid');
const INNER_QUERY_ALIAS = '__nc_inner'; const INNER_QUERY_ALIAS = '__nc_inner';
// const WRAPPER_QUERY_ALIAS = '__nc_wrapper'; // const WRAPPER_QUERY_ALIAS = '__nc_wrapper';
async function populatePk(model: Model, insertObj: any) { async function populatePk(model: Model, insertObj: any) {
@ -202,7 +203,7 @@ class BaseModelSqlv2 {
fieldsSet?: Set<string>; fieldsSet?: Set<string>;
} = {}, } = {},
ignoreViewFilterAndSort = false, ignoreViewFilterAndSort = false,
validateFormula = false
): Promise<any> { ): Promise<any> {
const { where, fields, ...rest } = this._getListArgs(args as any); const { where, fields, ...rest } = this._getListArgs(args as any);
@ -215,6 +216,7 @@ class BaseModelSqlv2 {
fieldsSet: args.fieldsSet, fieldsSet: args.fieldsSet,
viewId: this.viewId, viewId: this.viewId,
alias: INNER_QUERY_ALIAS, alias: INNER_QUERY_ALIAS,
validateFormula
}); });
if (+rest?.shuffle) { if (+rest?.shuffle) {
await this.shuffle({ qb: innerQb }); await this.shuffle({ qb: innerQb });
@ -287,10 +289,16 @@ class BaseModelSqlv2 {
if (!ignoreViewFilterAndSort) applyPaginate(innerQb, rest); if (!ignoreViewFilterAndSort) applyPaginate(innerQb, rest);
const proto = await this.getProto(); const proto = await this.getProto();
console.log(wrapperQb.toQuery()) let data;
const data = await this.execAndParse(wrapperQb);
try {
data = await this.execAndParse(wrapperQb);
} catch (e) {
if (!validateFormula) {
return this.list(args, ignoreViewFilterAndSort, true);
}
throw e;
}
return data?.map((d) => { return data?.map((d) => {
d.__proto__ = proto; d.__proto__ = proto;
return d; return d;
@ -1262,7 +1270,8 @@ class BaseModelSqlv2 {
private async getSelectQueryBuilderForFormula( private async getSelectQueryBuilderForFormula(
column: Column<any>, column: Column<any>,
tableAlias?: string tableAlias?: string,
validateFormula = false
) { ) {
const formula = await column.getColOptions<FormulaColumn>(); const formula = await column.getColOptions<FormulaColumn>();
if (formula.error) throw new Error(`Formula error: ${formula.error}`); if (formula.error) throw new Error(`Formula error: ${formula.error}`);
@ -1273,7 +1282,8 @@ class BaseModelSqlv2 {
this.model, this.model,
column, column,
{}, {},
tableAlias tableAlias,
validateFormula
); );
return qb; return qb;
} }
@ -1492,6 +1502,7 @@ class BaseModelSqlv2 {
viewId, viewId,
fieldsSet, fieldsSet,
alias, alias,
validateFormula
}: { }: {
fieldsSet?: Set<string>; fieldsSet?: Set<string>;
qb: Knex.QueryBuilder; qb: Knex.QueryBuilder;
@ -1500,6 +1511,7 @@ class BaseModelSqlv2 {
extractPkAndPv?: boolean; extractPkAndPv?: boolean;
viewId?: string; viewId?: string;
alias?: string; alias?: string;
validateFormula?:boolean
}): Promise<void> { }): Promise<void> {
const view = await View.get(viewId); const view = await View.get(viewId);
const viewColumns = viewId && (await View.getColumns(viewId)); const viewColumns = viewId && (await View.getColumns(viewId));
@ -1553,7 +1565,8 @@ class BaseModelSqlv2 {
try { try {
const selectQb = await this.getSelectQueryBuilderForFormula( const selectQb = await this.getSelectQueryBuilderForFormula(
qrValueColumn, qrValueColumn,
alias alias,
validateFormula
); );
qb.select({ qb.select({
[column.column_name]: selectQb.builder, [column.column_name]: selectQb.builder,
@ -1585,7 +1598,9 @@ class BaseModelSqlv2 {
case UITypes.Formula: case UITypes.Formula:
try { try {
const selectQb = await this.getSelectQueryBuilderForFormula( const selectQb = await this.getSelectQueryBuilderForFormula(
barcodeValueColumn barcodeValueColumn,
alias,
validateFormula
); );
qb.select({ qb.select({
[column.column_name]: selectQb.builder, [column.column_name]: selectQb.builder,
@ -1609,7 +1624,8 @@ class BaseModelSqlv2 {
try { try {
const selectQb = await this.getSelectQueryBuilderForFormula( const selectQb = await this.getSelectQueryBuilderForFormula(
column, column,
alias alias,
validateFormula
); );
qb.select( qb.select(
this.dbDriver.raw(`?? as ??`, [ this.dbDriver.raw(`?? as ??`, [

3
packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/formulav2/formulaQueryBuilderv2.ts

@ -822,6 +822,7 @@ export default async function formulaQueryBuilderv2(
column?: Column, column?: Column,
aliasToColumn = {}, aliasToColumn = {},
tableAlias?: string, tableAlias?: string,
validateFormula = false
) { ) {
// register jsep curly hook once only // register jsep curly hook once only
jsep.plugins.register(jsepCurlyHook); jsep.plugins.register(jsepCurlyHook);
@ -835,6 +836,8 @@ export default async function formulaQueryBuilderv2(
tableAlias tableAlias
); );
if(!validateFormula) return qb;
try { try {
// dry run qb.builder to see if it will break the grid view or not // dry run qb.builder to see if it will break the grid view or not
// if so, set formula error and show empty selectQb instead // if so, set formula error and show empty selectQb instead

Loading…
Cancel
Save