diff --git a/src/find-options/FindOperatorType.ts b/src/find-options/FindOperatorType.ts index 3830dec8779..7b9e04923a0 100644 --- a/src/find-options/FindOperatorType.ts +++ b/src/find-options/FindOperatorType.ts @@ -11,5 +11,6 @@ export type FindOperatorType = "not" | "in" | "any" | "isNull" + | "ilike" | "like" | "raw"; diff --git a/src/find-options/operator/ILike.ts b/src/find-options/operator/ILike.ts new file mode 100644 index 00000000000..1d3cfaffe46 --- /dev/null +++ b/src/find-options/operator/ILike.ts @@ -0,0 +1,9 @@ +import {FindOperator} from "../FindOperator"; + +/** + * Find Options Operator. + * Example: { someField: ILike("%SOME string%") } + */ +export function ILike(value: T|FindOperator) { + return new FindOperator("ilike", value); +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 635876fb9d2..61915963bad 100644 --- a/src/index.ts +++ b/src/index.ts @@ -84,6 +84,7 @@ export * from "./find-options/operator/In"; export * from "./find-options/operator/IsNull"; export * from "./find-options/operator/LessThan"; export * from "./find-options/operator/LessThanOrEqual"; +export * from "./find-options/operator/ILike"; export * from "./find-options/operator/Like"; export * from "./find-options/operator/MoreThan"; export * from "./find-options/operator/MoreThanOrEqual"; diff --git a/src/query-builder/QueryBuilder.ts b/src/query-builder/QueryBuilder.ts index 4776a441490..209758eebd6 100644 --- a/src/query-builder/QueryBuilder.ts +++ b/src/query-builder/QueryBuilder.ts @@ -882,6 +882,8 @@ export abstract class QueryBuilder { return `${aliasPath} >= ${parameters[0]}`; case "equal": return `${aliasPath} = ${parameters[0]}`; + case "ilike": + return `${aliasPath} ILIKE ${parameters[0]}`; case "like": return `${aliasPath} LIKE ${parameters[0]}`; case "between": diff --git a/test/functional/repository/find-options-operators/repository-find-operators.ts b/test/functional/repository/find-options-operators/repository-find-operators.ts index d0b88ebddf4..cf3df34cdb8 100644 --- a/test/functional/repository/find-options-operators/repository-find-operators.ts +++ b/test/functional/repository/find-options-operators/repository-find-operators.ts @@ -5,6 +5,7 @@ import { Between, Connection, Equal, + ILike, In, IsNull, LessThan, @@ -271,6 +272,50 @@ describe("repository > find options > operators", () => { }))); + it("ilike", () => Promise.all(connections.map(async connection => { + if (!(connection.driver instanceof PostgresDriver)) + return; + + // insert some fake data + const post1 = new Post(); + post1.title = "about #1"; + post1.likes = 12; + await connection.manager.save(post1); + const post2 = new Post(); + post2.title = "ABOUT #2"; + post2.likes = 3; + await connection.manager.save(post2); + + // check operator + const loadedPosts = await connection.getRepository(Post).find({ + title: ILike("%out #%") + }); + loadedPosts.should.be.eql([{ id: 1, likes: 12, title: "about #1" }, { id: 2, likes: 3, title: "ABOUT #2" }]); + + }))); + + it("not(ilike)", () => Promise.all(connections.map(async connection => { + if (!(connection.driver instanceof PostgresDriver)) + return; + + // insert some fake data + const post1 = new Post(); + post1.title = "about #1"; + post1.likes = 12; + await connection.manager.save(post1); + const post2 = new Post(); + post2.title = "ABOUT #2"; + post2.likes = 3; + await connection.manager.save(post2); + + // check operator + const loadedPosts = await connection.getRepository(Post).find({ + title: Not(ILike("%out #1")) + }); + loadedPosts.should.be.eql([{ id: 2, likes: 3, title: "ABOUT #2" }]); + + }))); + it("like", () => Promise.all(connections.map(async connection => { // insert some fake data