Skip to content

Commit 247fbac

Browse files
committed
Added negate
1 parent 9828b1c commit 247fbac

6 files changed

Lines changed: 33 additions & 4 deletions

File tree

src/query/ast/DebugStringVisitor.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { ArrayExpression, ArrowFunctionExpression, BigIntLiteral, BinaryExpression, BooleanLiteral, BracketExpression, CallExpression, CoalesceExpression, ConditionalExpression, Constant, DeleteStatement, ExistsExpression, Expression, ExpressionAs, Identifier, InsertStatement, JoinExpression, MemberExpression, NewObjectExpression, NotExits, NullExpression, NumberLiteral, OrderByExpression, ParameterExpression, ReturnUpdated, SelectStatement, StringLiteral, TableLiteral, TemplateElement, TemplateLiteral, UnionAllStatement, UpdateStatement, ValuesStatement } from "./Expressions.js";
1+
/* eslint-disable @typescript-eslint/no-base-to-string */
2+
import { ArrayExpression, ArrowFunctionExpression, BigIntLiteral, BinaryExpression, BooleanLiteral, BracketExpression, CallExpression, CoalesceExpression, ConditionalExpression, Constant, DeleteStatement, ExistsExpression, Expression, ExpressionAs, Identifier, InsertStatement, JoinExpression, MemberExpression, NegateExpression, NewObjectExpression, NotExits, NullExpression, NumberLiteral, OrderByExpression, ParameterExpression, ReturnUpdated, SelectStatement, StringLiteral, TableLiteral, TemplateElement, TemplateLiteral, UnionAllStatement, UpdateStatement, ValuesStatement } from "./Expressions.js";
23
import Visitor from "./Visitor.js";
34

45
const isBinary = (type) => /^(BinaryExpression|CoalesceExpression)$/.test(type);
@@ -133,6 +134,10 @@ export default class DebugStringVisitor extends Visitor<string> {
133134
return `DELETE FROM ${this.visit(e.table)}`;
134135
}
135136

137+
visitNegateExpression(e: NegateExpression): string {
138+
return `-${this.visit(e.expression)}`;
139+
}
140+
136141
visitExistsExpression(e: ExistsExpression): string {
137142
return `EXISTS (${this.visit(e.target)})`;
138143
}

src/query/ast/ExpressionToSql.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import EntityType, { IEntityProperty } from "../../entity-query/EntityType.js";
44
import EntityQuery from "../../model/EntityQuery.js";
55
import { FilteredExpression, filteredSymbol } from "../../model/events/FilteredExpression.js";
66
import { NotSupportedError } from "../parser/NotSupportedError.js";
7-
import { ArrowFunctionExpression, BigIntLiteral, BinaryExpression, BooleanLiteral, CallExpression, CoalesceExpression, ConditionalExpression, Constant, DeleteStatement, ExistsExpression, Expression, ExpressionAs, ExpressionType, Identifier, InsertStatement, JoinExpression, MemberExpression, UpsertStatement, NewObjectExpression, NotExits, NullExpression, NumberLiteral, OrderByExpression, ParameterExpression, ReturnUpdated, SelectStatement, StringLiteral, TableLiteral, TemplateLiteral, UnionAllStatement, UpdateStatement, ValuesStatement, NotExpression, ArrayExpression, BracketExpression } from "./Expressions.js";
7+
import { ArrowFunctionExpression, BigIntLiteral, BinaryExpression, BooleanLiteral, CallExpression, CoalesceExpression, ConditionalExpression, Constant, DeleteStatement, ExistsExpression, Expression, ExpressionAs, ExpressionType, Identifier, InsertStatement, JoinExpression, MemberExpression, UpsertStatement, NewObjectExpression, NotExits, NullExpression, NumberLiteral, OrderByExpression, ParameterExpression, ReturnUpdated, SelectStatement, StringLiteral, TableLiteral, TemplateLiteral, UnionAllStatement, UpdateStatement, ValuesStatement, NotExpression, ArrayExpression, BracketExpression, NegateExpression } from "./Expressions.js";
88
import { ITextQuery, QueryParameter, joinMap, prepare, prepareJoin } from "./IStringTransformer.js";
99
import ParameterScope from "./ParameterScope.js";
1010
import Visitor from "./Visitor.js";
@@ -158,6 +158,10 @@ export default class ExpressionToSql extends Visitor<ITextQuery> {
158158
return [ " NOT (", this.visit(e.expression) , ")"];
159159
}
160160

161+
visitNegateExpression(e: NegateExpression): ITextQuery {
162+
return ["(-", this.visit(e.expression), ")"];
163+
}
164+
161165
visitTemplateLiteral(e: TemplateLiteral): ITextQuery {
162166
const args = this.visitArray(e.value);
163167
return prepare `CONCAT(${args})`;

src/query/ast/Expressions.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,11 @@ export class NotExpression extends Expression {
203203
expression: Expression;
204204
}
205205

206+
export class NegateExpression extends Expression {
207+
readonly type = "NegateExpression";
208+
expression: Expression;
209+
}
210+
206211
export class ExistsExpression extends Expression {
207212
readonly type = "ExistsExpression";
208213
target: Expression;
@@ -485,6 +490,7 @@ export type ExpressionType =
485490
NotExits |
486491
UnionAllStatement |
487492
NotExpression |
493+
NegateExpression |
488494
BracketExpression |
489495
TemplateElement
490496
;

src/query/ast/Visitor.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { NotSupportedError } from "../parser/NotSupportedError.js";
2-
import { ArrayExpression, ArrowFunctionExpression, BigIntLiteral, BinaryExpression, BooleanLiteral, CallExpression, CoalesceExpression, ConditionalExpression, Constant, DeleteStatement, ExistsExpression, Expression, ExpressionAs, ExpressionType, Identifier, InsertStatement, JoinExpression, MemberExpression, UpsertStatement, NewObjectExpression, NotExits, NullExpression, NumberLiteral, OrderByExpression, ParameterExpression, ReturnUpdated, SelectStatement, StringLiteral, TableLiteral, TemplateElement, TemplateLiteral, UnionAllStatement, UpdateStatement, ValuesStatement, NotExpression, BracketExpression } from "./Expressions.js";
2+
import { ArrayExpression, ArrowFunctionExpression, BigIntLiteral, BinaryExpression, BooleanLiteral, CallExpression, CoalesceExpression, ConditionalExpression, Constant, DeleteStatement, ExistsExpression, Expression, ExpressionAs, ExpressionType, Identifier, InsertStatement, JoinExpression, MemberExpression, UpsertStatement, NewObjectExpression, NotExits, NullExpression, NumberLiteral, OrderByExpression, ParameterExpression, ReturnUpdated, SelectStatement, StringLiteral, TableLiteral, TemplateElement, TemplateLiteral, UnionAllStatement, UpdateStatement, ValuesStatement, NotExpression, BracketExpression, NegateExpression } from "./Expressions.js";
33

44

55
export default abstract class Visitor<T = any> {
@@ -77,10 +77,15 @@ export default abstract class Visitor<T = any> {
7777
return this.visitNotExpression(e);
7878
case "BracketExpression":
7979
return this.visitBracketExpression(e);
80+
case "NegateExpression":
81+
return this.visitNegateExpression(e);
8082
}
8183
const c: never = e;
8284
throw new Error(`${e1.type} Not implemented`);
8385
}
86+
visitNegateExpression(e: NegateExpression): T {
87+
throw new Error("Method not implemented.");
88+
}
8489
visitBracketExpression(e: BracketExpression): T {
8590
throw new Error("Method not implemented.");
8691
}

src/query/parser/ArrowToExpression.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { parseExpression } from "@babel/parser";
2-
import { ArrowFunctionExpression, BinaryExpression, BooleanLiteral, BracketExpression, CallExpression, CoalesceExpression, ConditionalExpression, Constant, Expression, ExpressionAs, Identifier, MemberExpression, NewObjectExpression, NotExpression, NullExpression, NumberLiteral, ParameterExpression, StringLiteral, TemplateLiteral } from "../ast/Expressions.js";
2+
import { ArrowFunctionExpression, BinaryExpression, BooleanLiteral, BracketExpression, CallExpression, CoalesceExpression, ConditionalExpression, Constant, Expression, ExpressionAs, Identifier, MemberExpression, NegateExpression, NewObjectExpression, NotExpression, NullExpression, NumberLiteral, ParameterExpression, StringLiteral, TemplateLiteral } from "../ast/Expressions.js";
33
import { BabelVisitor } from "./BabelVisitor.js";
44
import * as bpe from "@babel/types";
55
import Restructure from "./Restructure.js";
@@ -129,6 +129,10 @@ export default class ArrowToExpression extends BabelVisitor<Expression> {
129129
}
130130

131131
visitUnaryExpression(node: bpe.UnaryExpression): Expression {
132+
switch(node.operator) {
133+
case "-":
134+
return NegateExpression.create({ expression: this.visit(node.argument)});
135+
}
132136
return NotExpression.create({ expression: this.visit(node.argument)});
133137
}
134138

src/query/parser/Restructure.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ export default class Restructure extends TransformVisitor {
88
private map: Map<string, bpe.Node> = new Map();
99

1010
visitUnaryExpression(node: bpe.UnaryExpression): bpe.Node {
11+
if (node.operator === "-") {
12+
if (node.argument.type === "NumericLiteral") {
13+
return bpe.numericLiteral(-node.argument.value);
14+
}
15+
}
1116
return node;
1217
}
1318

0 commit comments

Comments
 (0)