Skip to content

Commit e670962

Browse files
committed
Fix (N)IN Filters for Postgres. Abstract postprocessor.
1 parent 596504c commit e670962

File tree

5 files changed

+31
-14
lines changed

5 files changed

+31
-14
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "strontium",
3-
"version": "2.4.6",
3+
"version": "2.4.7",
44
"description": "Strontium is a TypeScript toolkit for High Performance API servers built for Production not Projects.",
55
"main": "lib/src/index.js",
66
"types": "lib/src/index.d.ts",

src/query/drivers/sql/SQLFilterCompiler.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,21 @@ export const compileSQLFilter: FilterCompiler<[string, Array<any>]> = (
4646
// IN with an empty array typically causes an error - just make a tautological filter instead
4747
queries.push(["TRUE = FALSE", []])
4848
} else {
49-
queries.push(["?? IN ?", [field, subquery.$in]])
49+
queries.push([
50+
`?? IN (${subquery.$in.map((p: any) => "?").join(", ")})`,
51+
[field, ...subquery.$in],
52+
])
5053
}
5154
} else if (subquery.$nin !== undefined) {
5255
if (subquery.$nin.length === 0) {
5356
queries.push(["TRUE = TRUE", []])
5457
} else {
55-
queries.push(["?? NOT IN ?", [field, subquery.$nin]])
58+
queries.push([
59+
`?? NOT IN (${subquery.$nin
60+
.map((p: any) => "?")
61+
.join(", ")})`,
62+
[field, ...subquery.$nin],
63+
])
5664
}
5765
} else if (subquery.$neq !== undefined) {
5866
if (subquery.$neq === null) {

src/query/drivers/sql/TableRepository.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { pgQueryPostProcessor } from "../pg/PGQueryPostProcessor"
22
import { Repository } from "../../abstract/Repository"
3-
import { MySQLStore, SQLStore } from "../../../datastore"
3+
import { MySQLStore, PGStore, SQLStore } from "../../../datastore"
44
import { injectable } from "inversify"
55
import { isUndefined, omitBy } from "lodash"
66

@@ -17,13 +17,22 @@ export abstract class TableRepository<
1717
T extends any,
1818
K extends keyof T
1919
> extends Repository<T, K> {
20+
private postProcessor: (
21+
query: string,
22+
parameters: Array<any>
23+
) => [string, Array<any>] = (q, p) => [q, p]
24+
2025
constructor(
2126
private store: SQLStore,
2227
private tableName: string,
2328
private queryFields: Array<keyof T>,
2429
private primaryKeyField: K
2530
) {
2631
super()
32+
33+
if (store instanceof PGStore) {
34+
this.postProcessor = pgQueryPostProcessor
35+
}
2736
}
2837

2938
async create(
@@ -75,7 +84,7 @@ export abstract class TableRepository<
7584

7685
parameters.push(this.primaryKeyField)
7786

78-
let [processedQuery, processedParameters] = pgQueryPostProcessor(
87+
let [processedQuery, processedParameters] = this.postProcessor(
7988
query,
8089
parameters
8190
)
@@ -126,7 +135,7 @@ export abstract class TableRepository<
126135
OFFSET ${pagination.offset}`
127136
}
128137

129-
let [processedQuery, processedParameters] = pgQueryPostProcessor(
138+
let [processedQuery, processedParameters] = this.postProcessor(
130139
lookupQuery,
131140
parameters
132141
)
@@ -161,7 +170,7 @@ export abstract class TableRepository<
161170
payloadParameters.push(filteredPayload[k])
162171
})
163172

164-
let [processedQuery, processedParameters] = pgQueryPostProcessor(
173+
let [processedQuery, processedParameters] = this.postProcessor(
165174
lookupQuery,
166175
[...payloadParameters, ...filterParameters]
167176
)
@@ -182,7 +191,7 @@ export abstract class TableRepository<
182191
${filterQuery}
183192
`
184193

185-
let [processedQuery, processedParameters] = pgQueryPostProcessor(
194+
let [processedQuery, processedParameters] = this.postProcessor(
186195
lookupQuery,
187196
parameters
188197
)

tests/query/drivers/PGQueryPostProcessor.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ describe("PGQueryPostProcessor", () => {
116116
expectQueryOutcome(
117117
finalQuery,
118118
["a", "b", "c", "d", ...filterParameters, 250],
119-
"SELECT a, b, c, d FROM myTable WHERE ((test = $1) OR (((otherThing > $2) AND (moreThings = $3)) AND (finalThing IN $4))) AND (rabbit = $5) LIMIT $6",
120-
["thing", 123, "test", ["final", "testing"], "foot", 250]
119+
"SELECT a, b, c, d FROM myTable WHERE ((test = $1) OR (((otherThing > $2) AND (moreThings = $3)) AND (finalThing IN ($4, $5)))) AND (rabbit = $6) LIMIT $7",
120+
["thing", 123, "test", "final", "testing", "foot", 250]
121121
)
122122
})
123123
})

tests/query/drivers/SQLFilterCompiler.spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ describe("SQLFilterCompiler", () => {
4141
$in: [15, 16, 17],
4242
},
4343
},
44-
"?? IN ?",
45-
["id", [15, 16, 17]]
44+
"?? IN (?, ?, ?)",
45+
["id", 15, 16, 17]
4646
)
4747
})
4848

@@ -65,8 +65,8 @@ describe("SQLFilterCompiler", () => {
6565
$nin: [15, 16, 17],
6666
},
6767
},
68-
"?? NOT IN ?",
69-
["id", [15, 16, 17]]
68+
"?? NOT IN (?, ?, ?)",
69+
["id", 15, 16, 17]
7070
)
7171
})
7272

0 commit comments

Comments
 (0)