From bf70a58c09e9925a1d871f7f3446c32eab22fc5e Mon Sep 17 00:00:00 2001 From: Jesse Zhang Date: Tue, 29 May 2018 15:41:00 -0400 Subject: [PATCH] fix: allow plucked join one field to be filtered on properly, bump packages --- jest.config.js | 1 - package.json | 32 +++++++++++++++--------------- src/parse-api-filter.spec.ts | 8 +++++++- src/visitors/expression-visitor.ts | 31 +++++++++++------------------ wallaby.js | 1 + 5 files changed, 36 insertions(+), 37 deletions(-) diff --git a/jest.config.js b/jest.config.js index 308608b..965f561 100755 --- a/jest.config.js +++ b/jest.config.js @@ -6,7 +6,6 @@ module.exports = { moduleFileExtensions: ["ts", "js"], setupTestFrameworkScriptFile: "/src/tests/bootstrap.ts", collectCoverage: true, - mapCoverage: true, collectCoverageFrom: [ "src/**/*.ts", "!src/**/index.ts", diff --git a/package.json b/package.json index 22c7c66..a8a18fc 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@lchemy/api-filter-parser", "description": "", - "version": "1.0.0-beta.0", + "version": "1.0.0-beta.1", "contributors": [ "Jesse Zhang" ], @@ -23,28 +23,28 @@ }, "dependencies": { "@lchemy/antlr4ts": "^0.4.1-alpha.1", - "@lchemy/orm": "^1.0.0-beta.0" + "@lchemy/orm": "^1.0.0-beta.3" }, "devDependencies": { "@lchemy/antlr4ts-cli": "^0.4.0-alpha.6", - "@types/jest": "^22.1.2", - "@types/knex": "^0.14.7", - "coveralls": "^3.0.0", + "@types/jest": "^22.2.3", + "@types/knex": "^0.14.14", + "coveralls": "^3.0.1", "del": "^3.0.0", - "fs-extra": "^5.0.0", - "glob-promise": "^3.3.0", + "fs-extra": "^6.0.1", + "glob-promise": "^3.4.0", "gulp": "^4.0.0", "gulp-plumber": "^1.2.0", "gulp-tslint": "^8.1.3", - "gulp-typescript": "^4.0.1", - "jest": "^22.3.0", - "jest-cli": "^22.3.0", - "knex": "^0.14.3", - "merge2": "^1.2.1", - "shelljs": "^0.8.1", - "ts-jest": "^22.0.4", - "tslint": "^5.9.1", - "typescript": "^2.7.2", + "gulp-typescript": "^4.0.2", + "jest": "^23.0.1", + "jest-cli": "^23.0.1", + "knex": "^0.14.6", + "merge2": "^1.2.2", + "shelljs": "^0.8.2", + "ts-jest": "^22.4.6", + "tslint": "^5.10.0", + "typescript": "^2.8.3", "vinyl-map": "^1.0.2" } } diff --git a/src/parse-api-filter.spec.ts b/src/parse-api-filter.spec.ts index 0d66247..407c5c4 100644 --- a/src/parse-api-filter.spec.ts +++ b/src/parse-api-filter.spec.ts @@ -206,7 +206,7 @@ describe("parse api filter", () => { await expect(filterPromise).rejects.toThrow(); }); - it("should parse for plucked join one", async () => { + it("should parse for plucked join one exists", async () => { const filter = await parseApiFilter($classesOrm, `teacherName exists`); expect(filter).toBeInstanceOf(models.AndFilterGroup); @@ -220,6 +220,12 @@ describe("parse api filter", () => { const { left } = expressions.find((expr) => expr instanceof models.IsNotNullFilterNode) as models.IsNotNullFilterNode; expect(left.toString()).toBe("classes.teacherName.name"); }); + + it("should parse for plucked join one filters", async () => { + const filter = await parseApiFilter($classesOrm, `teacherName eq "test"`); + expect(filter).toBeInstanceOf(models.EqualFilterNode); + expect((filter as models.EqualFilterNode).left.toString()).toBe("classes.teacherName.name"); + }); }); describe("join many operations", () => { diff --git a/src/visitors/expression-visitor.ts b/src/visitors/expression-visitor.ts index 32eaf26..ee57322 100644 --- a/src/visitors/expression-visitor.ts +++ b/src/visitors/expression-visitor.ts @@ -71,9 +71,7 @@ export class ExpressionVisitor extends AbstractParseTreeVisitor implemen visitOpNullCheckExpression(ctx: OpNullCheckExpressionContext): Filter { const op = ctx.OP_NULL_CHECK().text, - value = ctx.value().accept(this.valueVisitor) as any; - - assertColumnValue(value); + value = toColumnValue(ctx.value().accept(this.valueVisitor)); switch (op) { case "is null": @@ -89,9 +87,7 @@ export class ExpressionVisitor extends AbstractParseTreeVisitor implemen const op = ctx.OP_COMPARISON().text; const [left, right] = ctx.value().map((valueCtx) => { - const value = valueCtx.accept(this.valueVisitor) as any; - assertColumnValue(value); - return value; + return toColumnValue(valueCtx.accept(this.valueVisitor)); }); switch (op) { @@ -116,9 +112,7 @@ export class ExpressionVisitor extends AbstractParseTreeVisitor implemen const op = ctx.OP_LIKE().text; const [left, right] = ctx.value().map((valueCtx) => { - const value = valueCtx.accept(this.valueVisitor) as any; - assertColumnValue(value); - return value; + return toColumnValue(valueCtx.accept(this.valueVisitor)); }); switch (op) { @@ -139,9 +133,7 @@ export class ExpressionVisitor extends AbstractParseTreeVisitor implemen const op = ctx.OP_BETWEEN().text; const [left, start, end] = ctx.value().map((valueCtx) => { - const value = valueCtx.accept(this.valueVisitor) as any; - assertColumnValue(value); - return value; + return toColumnValue(valueCtx.accept(this.valueVisitor)); }); switch (op) { @@ -158,9 +150,7 @@ export class ExpressionVisitor extends AbstractParseTreeVisitor implemen const op = ctx.OP_IN().text; const [left, ...values] = ctx.value().map((valueCtx) => { - const value = valueCtx.accept(this.valueVisitor) as any; - assertColumnValue(value); - return value; + return toColumnValue(valueCtx.accept(this.valueVisitor)); }); switch (op) { @@ -219,7 +209,7 @@ export class ExpressionVisitor extends AbstractParseTreeVisitor implemen visitOpHaveCountExpression(ctx: OpHaveCountExpressionContext): Filter { const op = ctx.OP_COMPARISON().text; - const [left, right] = ctx.value().map((valueCtx) => { + const [left, rawRight] = ctx.value().map((valueCtx) => { return valueCtx.accept(this.valueVisitor) as any; }); @@ -227,7 +217,7 @@ export class ExpressionVisitor extends AbstractParseTreeVisitor implemen throw new Error(`Expected ${ left } to be a join many field`); } - assertColumnValue(right); + const right = toColumnValue(rawRight); switch (op) { case "eq": @@ -256,7 +246,7 @@ export class ExpressionVisitor extends AbstractParseTreeVisitor implemen } } -function assertColumnValue(value: ValueType): void { +function toColumnValue(value: ValueType): number | string | ColumnField | DerivedField | WrappedRaw { if ( typeof value === "number" || typeof value === "string" || @@ -264,7 +254,10 @@ function assertColumnValue(value: ValueType): void { value instanceof DerivedField || value instanceof WrappedRaw ) { - return; + return value; + } + if (isPluckedJoinOneField(value)) { + return value["🜁"].pluckField; } throw new Error(`Expected ${ value } to be number, string, column field, derived field, or raw`); } diff --git a/wallaby.js b/wallaby.js index 249154d..507539e 100644 --- a/wallaby.js +++ b/wallaby.js @@ -11,6 +11,7 @@ module.exports = () => { "src/**/*.spec.ts" ], filesWithNoCoverageCalculated: [ + "src/codegen/**/*.ts", "src/tests/**/*.ts" ], env: {