From 1ace521f3f60e26c079b11962f16578ec48c001b Mon Sep 17 00:00:00 2001 From: Guru Sharan Kumar Ram Date: Thu, 18 Sep 2025 00:14:35 +0530 Subject: [PATCH 1/4] fix: remove empty WHERE clause when no conditions exist --- index.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/index.js b/index.js index 0fb0894..edf0e54 100644 --- a/index.js +++ b/index.js @@ -192,27 +192,27 @@ class PagiHelp { joinQuery; let replacements = []; - let whereQuery = " WHERE "; + let whereQuery = ""; if (additionalWhereConditions.length > 0) { - whereQuery += this.genSchema(additionalWhereConditions, replacements, true) + " AND "; + whereQuery += (whereQuery === "" ? " WHERE " : " AND ") + this.genSchema(additionalWhereConditions, replacements, true); } if (filterConditions.length > 0) { - whereQuery += this.genSchema(filterConditions, replacements, false) + " AND "; + whereQuery += (whereQuery === "" ? " WHERE " : " AND ") + this.genSchema(filterConditions, replacements, false); } - if(searchColumnList && searchColumnList.length>0 && paginationObject.search !== "") { - whereQuery = whereQuery + "( "; + if(searchColumnList && searchColumnList.length > 0 && paginationObject.search !== "") { + whereQuery += (whereQuery === "" ? " WHERE " : " AND ") + "( "; for (let column of searchColumnList) { - whereQuery = whereQuery + column + " LIKE ? OR "; + whereQuery += column + " LIKE ? OR "; replacements.push(`%${paginationObject.search}%`); } whereQuery = rtrim(whereQuery, "OR "); - whereQuery = whereQuery + " )"; - } else { - whereQuery = rtrim(whereQuery, "AND "); + whereQuery += " )"; } + whereQuery = rtrim(whereQuery, "AND "); + whereQuery = rtrim(whereQuery, "OR "); query = query + whereQuery; countQuery = countQuery + whereQuery; From 2639ef71f6c6e124c2c69a38cb51570f74853be4 Mon Sep 17 00:00:00 2001 From: Guru Sharan Kumar Ram Date: Thu, 18 Sep 2025 04:39:51 +0530 Subject: [PATCH 2/4] refactor: improve space handling for AND/OR in whereQuery --- index.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/index.js b/index.js index edf0e54..efa6fce 100644 --- a/index.js +++ b/index.js @@ -82,7 +82,7 @@ class PagiHelp { returnString += this.tupleCreator(schemaObject, replacements, asItIs) + " AND "; } else { - let subString = "( "; + let subString = "("; for (let subObject of schemaObject) { subString += this.genSchema(subObject, replacements, asItIs) + " OR "; } @@ -184,7 +184,7 @@ class PagiHelp { "`" + joinQuery; - let totalCountQuery = + let totalCountQuery = "SELECT COUNT(*) AS countValue " + " FROM `" + tableName + @@ -202,17 +202,14 @@ class PagiHelp { } if(searchColumnList && searchColumnList.length > 0 && paginationObject.search !== "") { - whereQuery += (whereQuery === "" ? " WHERE " : " AND ") + "( "; + whereQuery += (whereQuery === "" ? " WHERE " : " AND ") + "("; for (let column of searchColumnList) { - whereQuery += column + " LIKE ? OR "; - replacements.push(`%${paginationObject.search}%`); + whereQuery += column + " LIKE ? OR "; + replacements.push(`%${paginationObject.search}%`); } - whereQuery = rtrim(whereQuery, "OR "); - whereQuery += " )"; + whereQuery = whereQuery.replace(/\s*(AND|OR)\s*$/i, ""); + whereQuery += ")"; } - - whereQuery = rtrim(whereQuery, "AND "); - whereQuery = rtrim(whereQuery, "OR "); query = query + whereQuery; countQuery = countQuery + whereQuery; From 1d6e2818c91a4ea5e6b2360ae63199106e5ce2f0 Mon Sep 17 00:00:00 2001 From: Guru Sharan Kumar Ram Date: Mon, 22 Sep 2025 17:20:55 +0530 Subject: [PATCH 3/4] Improve sorting functionality --- index.js | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/index.js b/index.js index efa6fce..d6fb16d 100644 --- a/index.js +++ b/index.js @@ -16,6 +16,12 @@ class PagiHelp { columnNameConverter = (x) => x; + toCamelCase = (str) => { + return str.replace(/_([a-zA-Z0-9])/g, (_, char) => { + return /[a-zA-Z]/.test(char) ? char.toUpperCase() : char; + }); + }; + columNames = (arr) => arr.map((a) => { if (a.prefix) { @@ -109,12 +115,6 @@ class PagiHelp { let filterConditions = []; if (filters && filters.length > 0) { - // Function to convert snake_case to camelCase - const toCamelCase = (str) => { - return str.replace(/_([a-zA-Z0-9])/g, (_, char) => { - return /[a-zA-Z]/.test(char) ? char.toUpperCase() : char; - }); - }; const processCondition = (condition) => { if (Array.isArray(condition[0])) { @@ -126,8 +126,8 @@ class PagiHelp { // Find the column matching the alias let column = columnList.find(col => col.alias === field); if (!column) { - const camelCaseField = toCamelCase(field); - column = columnList.find(col => toCamelCase(col.alias) === camelCaseField); + const camelCaseField = this.toCamelCase(field); + column = columnList.find(col => this.toCamelCase(col.alias) === camelCaseField); } // if field matches "prefix.name" @@ -309,13 +309,24 @@ class PagiHelp { sort.sorts[i] = sort.sorts[i].toUpperCase() } for (let i = 0; i < sort.attributes.length; i++) { - orderByQuery = - orderByQuery + - "" + - this.columnNameConverter(SqlString.escapeId(sort.attributes[i])) + - "" + - sort.sorts[i] + - ","; + let attr = sort.attributes[i]; + let aliasMatch = null; + for (let option of options) { + let found = option.columnList.find(col => col.alias === attr); + if (!found) { + const camelCaseAttr = this.toCamelCase(attr); + found = option.columnList.find(col => this.toCamelCase(col.alias) === camelCaseAttr); + } + if (found) { + aliasMatch = found.alias; + break; + } + } + if (aliasMatch) { + orderByQuery += `${aliasMatch} ${sort.sorts[i]},`; + } else { + orderByQuery += this.columnNameConverter(SqlString.escapeId(attr)) + " " + sort.sorts[i] + ","; + } } orderByQuery = rtrim(orderByQuery, ","); query = query + orderByQuery; From 08dba167b707e2d33add5e5feaa166973aac7848 Mon Sep 17 00:00:00 2001 From: Guru Sharan Kumar Ram Date: Mon, 22 Sep 2025 17:33:55 +0530 Subject: [PATCH 4/4] feat: Add sortQuery support --- index.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index d6fb16d..40f7d32 100644 --- a/index.js +++ b/index.js @@ -302,11 +302,12 @@ class PagiHelp { } let sort = paginationObject.sort; - if (sort && Object.keys(sort).length !== 0) { - for(let i = 0; i < sort.sorts.length; i++) { - if(!allowedSorts.includes(sort.sorts[i].toUpperCase())) - throw "INVALID SORT VALUE"; - sort.sorts[i] = sort.sorts[i].toUpperCase() + let hasSortQuery = options.some(opt => opt.sortQuery); + if (!hasSortQuery && sort && Object.keys(sort).length !== 0) { + for (let i = 0; i < sort.sorts.length; i++) { + if (!allowedSorts.includes(sort.sorts[i].toUpperCase())) + throw "INVALID SORT VALUE"; + sort.sorts[i] = sort.sorts[i].toUpperCase(); } for (let i = 0; i < sort.attributes.length; i++) { let attr = sort.attributes[i]; @@ -332,6 +333,13 @@ class PagiHelp { query = query + orderByQuery; } + for (let option of options) { + if (option.sortQuery) { + query = query + " " + option.sortQuery.trim(); + break; + } + } + if (paginationObject.pageNo && paginationObject.itemsPerPage) { let offset = (paginationObject.pageNo - 1) * paginationObject.itemsPerPage;