Skip to content

Commit 085155c

Browse files
author
Annie Zhang
authored
Handle column renaming in makeQueryTemplate and __table (#345)
* Handle column renaming in makeQueryTemplate and __table * use replace with regex instead of replaceAll * don't rename primitive arrays
1 parent c835e3b commit 085155c

File tree

2 files changed

+67
-1
lines changed

2 files changed

+67
-1
lines changed

src/table.js

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,11 @@ export function makeQueryTemplate(operations, source) {
307307
throw new Error("missing from table");
308308
if (select.columns && select.columns.length === 0)
309309
throw new Error("at least one column must be selected");
310-
const columns = select.columns ? select.columns.map(escaper).join(", ") : "*";
310+
const names = new Map(operations.names?.map(({column, name}) => [column, name]));
311+
const columns = select.columns ? select.columns.map((column) => {
312+
const override = names.get(column);
313+
return override ? `${escaper(column)} AS ${escaper(override)}` : escaper(column);
314+
}).join(", ") : "*";
311315
const args = [
312316
[`SELECT ${columns} FROM ${formatTable(from.table, escaper)}`]
313317
];
@@ -659,6 +663,27 @@ export function __table(source, operations) {
659663
Object.fromEntries(operations.select.columns.map((c) => [c, d[c]]))
660664
);
661665
}
666+
if (!primitive && operations.names) {
667+
const overridesByName = new Map(operations.names.map((n) => [n.column, n]));
668+
if (schema) {
669+
schema = schema.map((s) => {
670+
const override = overridesByName.get(s.name);
671+
return ({...s, ...(override ? {name: override.name} : null)});
672+
});
673+
}
674+
if (columns) {
675+
columns = columns.map((c) => {
676+
const override = overridesByName.get(c);
677+
return override?.name ?? c;
678+
});
679+
}
680+
source = source.map((d) =>
681+
Object.fromEntries(Object.keys(d).map((k) => {
682+
const override = overridesByName.get(k);
683+
return [override?.name ?? k, d[k]];
684+
}))
685+
);
686+
}
662687
if (primitive) source = source.map((d) => d.value);
663688
if (source !== input) {
664689
if (schema) source.schema = schema;

test/table-test.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ const baseOperations = {
3535
}
3636
};
3737

38+
function escape(identifier) {
39+
return `\`${identifier.replace(/`/g, "``")}\``;
40+
}
41+
3842
describe("makeQueryTemplate", () => {
3943
it("makeQueryTemplate null table", () => {
4044
const source = {};
@@ -437,6 +441,25 @@ describe("makeQueryTemplate", () => {
437441
);
438442
assert.deepStrictEqual(params, ["val1", "val2"]);
439443
});
444+
445+
it("makeQueryTemplate names", () => {
446+
const source = {name: "db", dialect: "mysql", escape};
447+
let operations = {
448+
...baseOperations,
449+
select: {
450+
columns: ["col1", "col2", "col3"]
451+
},
452+
names: [
453+
{column: "col1", name: "name1"},
454+
{column: "col2", name: "name2"},
455+
{column: "col3", name: "name3"}
456+
]
457+
};
458+
459+
const [parts, ...params] = makeQueryTemplate(operations, source);
460+
assert.deepStrictEqual(parts.join("?"), "SELECT `col1` AS `name1`, `col2` AS `name2`, `col3` AS `name3` FROM `table1`");
461+
assert.deepStrictEqual(params, []);
462+
});
440463
});
441464

442465
describe("__table", () => {
@@ -585,6 +608,24 @@ describe("__table", () => {
585608
[{name: "a", type: "number"}, {name: "b", type: "number"}, {name: "c", type: "number"}]
586609
);
587610
});
611+
612+
it("__table names", () => {
613+
const operations = {
614+
...EMPTY_TABLE_DATA.operations,
615+
names: [{column: "a", name: "nameA"}]
616+
};
617+
assert.deepStrictEqual(__table(source, operations), [{nameA: 1, b: 2, c: 3}, {nameA: 2, b: 4, c: 6}, {nameA: 3, b: 6, c: 9}]);
618+
source.columns = ["a", "b", "c"];
619+
assert.deepStrictEqual(
620+
__table(source, operations).columns,
621+
["nameA", "b", "c"]
622+
);
623+
source.schema = [{name: "a", type: "number"}, {name: "b", type: "number"}, {name: "c", type: "number"}];
624+
assert.deepStrictEqual(
625+
__table(source, operations).schema,
626+
[{name: "nameA", type: "number"}, {name: "b", type: "number"}, {name: "c", type: "number"}]
627+
);
628+
});
588629
});
589630

590631
describe("getTypeValidator filters accurately", () => {

0 commit comments

Comments
 (0)