@bessemer/cornerstone 0.5.29 → 0.5.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/expression/core-expression.d.ts +42 -0
- package/dist/expression/core-expression.d.ts.map +1 -0
- package/dist/expression/core-expression.js +129 -0
- package/dist/expression/core-expression.js.map +1 -0
- package/dist/expression/expression-mapper.d.ts.map +1 -1
- package/dist/expression/expression-mapper.js +2 -1
- package/dist/expression/expression-mapper.js.map +1 -1
- package/dist/expression/expression.d.ts +18 -22
- package/dist/expression/expression.d.ts.map +1 -1
- package/dist/expression/expression.js +34 -92
- package/dist/expression/expression.js.map +1 -1
- package/dist/expression/numeric-expression.d.ts +5 -6
- package/dist/expression/numeric-expression.d.ts.map +1 -1
- package/dist/expression/numeric-expression.js +9 -9
- package/dist/expression/numeric-expression.js.map +1 -1
- package/dist/expression.d.ts +1 -2
- package/dist/expression.d.ts.map +1 -1
- package/dist/expression.js +0 -2
- package/dist/expression.js.map +1 -1
- package/dist/sql/sql-expression-parser.d.ts +11 -0
- package/dist/sql/sql-expression-parser.d.ts.map +1 -0
- package/dist/sql/sql-expression-parser.js +108 -0
- package/dist/sql/sql-expression-parser.js.map +1 -0
- package/dist/sql/sql.d.ts +7 -0
- package/dist/sql/sql.d.ts.map +1 -0
- package/dist/sql/sql.js +19 -0
- package/dist/sql/sql.js.map +1 -0
- package/dist/sql.d.ts +6 -0
- package/dist/sql.d.ts.map +1 -0
- package/dist/sql.js +6 -0
- package/dist/sql.js.map +1 -0
- package/package.json +1 -1
- package/dist/expression/basic-expression.d.ts +0 -35
- package/dist/expression/basic-expression.d.ts.map +0 -1
- package/dist/expression/basic-expression.js +0 -53
- package/dist/expression/basic-expression.js.map +0 -1
- package/dist/expression/sql-expression-parser.d.ts +0 -8
- package/dist/expression/sql-expression-parser.d.ts.map +0 -1
- package/dist/expression/sql-expression-parser.js +0 -51
- package/dist/expression/sql-expression-parser.js.map +0 -1
@@ -0,0 +1,42 @@
|
|
1
|
+
import { Expression } from '@bessemer/cornerstone/expression';
|
2
|
+
import { BasicType } from '@bessemer/cornerstone/types';
|
3
|
+
import { Signatures } from '@bessemer/cornerstone';
|
4
|
+
export declare const ValueExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<unknown, [value: unknown], {
|
5
|
+
value: unknown;
|
6
|
+
}>;
|
7
|
+
export declare const VariableExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<{}, [name: string], Expression<{}> & {
|
8
|
+
name: string;
|
9
|
+
}>;
|
10
|
+
export declare const NotExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<boolean, [value: Expression<boolean>], Expression<boolean> & {
|
11
|
+
value: Expression<boolean>;
|
12
|
+
}>;
|
13
|
+
export declare const AndExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<boolean, [operands: Expression<boolean>[]], Expression<boolean> & {
|
14
|
+
operands: Expression<boolean>[];
|
15
|
+
}>;
|
16
|
+
export declare const OrExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<boolean, [operands: Expression<boolean>[]], Expression<boolean> & {
|
17
|
+
operands: Expression<boolean>[];
|
18
|
+
}>;
|
19
|
+
export declare const EqualsExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<boolean, [operands: Expression<Signatures.Signable>[]], Expression<boolean> & {
|
20
|
+
operands: Expression<Signatures.Signable>[];
|
21
|
+
}>;
|
22
|
+
export declare const ContainsExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<boolean, [collection: Expression<Signatures.Signable[]>, operands: Expression<Signatures.Signable>[]], Expression<boolean> & {
|
23
|
+
collection: Expression<Signatures.Signable[]>;
|
24
|
+
operands: Expression<Signatures.Signable>[];
|
25
|
+
}>;
|
26
|
+
export declare const LessThanExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<boolean, [left: Expression<BasicType>, right: Expression<BasicType>], Expression<boolean> & {
|
27
|
+
left: Expression<BasicType>;
|
28
|
+
right: Expression<BasicType>;
|
29
|
+
}>;
|
30
|
+
export declare const LessThanOrEqualExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<boolean, [left: Expression<BasicType>, right: Expression<BasicType>], Expression<boolean> & {
|
31
|
+
left: Expression<BasicType>;
|
32
|
+
right: Expression<BasicType>;
|
33
|
+
}>;
|
34
|
+
export declare const GreaterThanExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<boolean, [left: Expression<BasicType>, right: Expression<BasicType>], Expression<boolean> & {
|
35
|
+
left: Expression<BasicType>;
|
36
|
+
right: Expression<BasicType>;
|
37
|
+
}>;
|
38
|
+
export declare const GreaterThanOrEqualExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<boolean, [left: Expression<BasicType>, right: Expression<BasicType>], Expression<boolean> & {
|
39
|
+
left: Expression<BasicType>;
|
40
|
+
right: Expression<BasicType>;
|
41
|
+
}>;
|
42
|
+
//# sourceMappingURL=core-expression.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"core-expression.d.ts","sourceRoot":"","sources":["../../src/expression/core-expression.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvD,OAAO,EAAkC,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAGlF,eAAO,MAAM,eAAe;;EAQ1B,CAAA;AAEF,eAAO,MAAM,kBAAkB;;EAU7B,CAAA;AAEF,eAAO,MAAM,aAAa;;EAQxB,CAAA;AAEF,eAAO,MAAM,aAAa;;EAUxB,CAAA;AAEF,eAAO,MAAM,YAAY;;EAUvB,CAAA;AAEF,eAAO,MAAM,gBAAgB;;EAe3B,CAAA;AAEF,eAAO,MAAM,kBAAkB;;;EAU7B,CAAA;AAEF,eAAO,MAAM,kBAAkB;;;EAQ7B,CAAA;AAEF,eAAO,MAAM,yBAAyB;;;EAQpC,CAAA;AAEF,eAAO,MAAM,qBAAqB;;;EAQhC,CAAA;AAEF,eAAO,MAAM,4BAA4B;;;EAQvC,CAAA"}
|
@@ -0,0 +1,129 @@
|
|
1
|
+
// src/expression/core-expression.ts
|
2
|
+
import { defineExpression } from "@bessemer/cornerstone/expression/internal";
|
3
|
+
import { Arrays, Objects, Preconditions, Signatures } from "@bessemer/cornerstone";
|
4
|
+
var ValueExpression = defineExpression({
|
5
|
+
expressionKey: "Value",
|
6
|
+
builder: (value) => {
|
7
|
+
return { value };
|
8
|
+
},
|
9
|
+
resolver: ({ value }, evaluate, context) => {
|
10
|
+
return value;
|
11
|
+
}
|
12
|
+
});
|
13
|
+
var VariableExpression = defineExpression({
|
14
|
+
expressionKey: "Variable",
|
15
|
+
builder: (name) => {
|
16
|
+
return { name };
|
17
|
+
},
|
18
|
+
resolver: ({ name }, evaluate, context) => {
|
19
|
+
const value = context.variables[name];
|
20
|
+
Preconditions.isPresent(value);
|
21
|
+
return value;
|
22
|
+
}
|
23
|
+
});
|
24
|
+
var NotExpression = defineExpression({
|
25
|
+
expressionKey: "Not",
|
26
|
+
builder: (value) => {
|
27
|
+
return { value };
|
28
|
+
},
|
29
|
+
resolver: (expression, evaluate) => {
|
30
|
+
return !evaluate(expression.value);
|
31
|
+
}
|
32
|
+
});
|
33
|
+
var AndExpression = defineExpression({
|
34
|
+
expressionKey: "And",
|
35
|
+
builder: (operands) => {
|
36
|
+
return { operands };
|
37
|
+
},
|
38
|
+
resolver: (expression, evaluate) => {
|
39
|
+
const values = expression.operands.map((it) => evaluate(it));
|
40
|
+
const falseValue = values.find((it) => !it);
|
41
|
+
return Objects.isNil(falseValue);
|
42
|
+
}
|
43
|
+
});
|
44
|
+
var OrExpression = defineExpression({
|
45
|
+
expressionKey: "Or",
|
46
|
+
builder: (operands) => {
|
47
|
+
return { operands };
|
48
|
+
},
|
49
|
+
resolver: (expression, evaluate) => {
|
50
|
+
const values = expression.operands.map((it) => evaluate(it));
|
51
|
+
const trueValue = values.find((it) => it);
|
52
|
+
return Objects.isPresent(trueValue);
|
53
|
+
}
|
54
|
+
});
|
55
|
+
var EqualsExpression = defineExpression({
|
56
|
+
expressionKey: "Equals",
|
57
|
+
builder: (operands) => {
|
58
|
+
return { operands };
|
59
|
+
},
|
60
|
+
resolver: (expression, evaluate) => {
|
61
|
+
const values = expression.operands.map((it) => evaluate(it)).map(Signatures.sign);
|
62
|
+
if (values.length === 0) {
|
63
|
+
return true;
|
64
|
+
}
|
65
|
+
const first = values[0];
|
66
|
+
return values.every((val) => val === first);
|
67
|
+
}
|
68
|
+
});
|
69
|
+
var ContainsExpression = defineExpression({
|
70
|
+
expressionKey: "Contains",
|
71
|
+
builder: (collection, operands) => {
|
72
|
+
return { collection, operands };
|
73
|
+
},
|
74
|
+
resolver: (expression, evaluate) => {
|
75
|
+
const collection = evaluate(expression.collection);
|
76
|
+
const values = expression.operands.map((it) => evaluate(it));
|
77
|
+
return Arrays.containsAll(collection, values);
|
78
|
+
}
|
79
|
+
});
|
80
|
+
var LessThanExpression = defineExpression({
|
81
|
+
expressionKey: "Basic.LessThan",
|
82
|
+
builder: (left, right) => {
|
83
|
+
return { left, right };
|
84
|
+
},
|
85
|
+
resolver: ({ left, right }, evaluate) => {
|
86
|
+
return evaluate(left) < evaluate(right);
|
87
|
+
}
|
88
|
+
});
|
89
|
+
var LessThanOrEqualExpression = defineExpression({
|
90
|
+
expressionKey: "Basic.LessThanOrEqual",
|
91
|
+
builder: (left, right) => {
|
92
|
+
return { left, right };
|
93
|
+
},
|
94
|
+
resolver: ({ left, right }, evaluate) => {
|
95
|
+
return evaluate(left) <= evaluate(right);
|
96
|
+
}
|
97
|
+
});
|
98
|
+
var GreaterThanExpression = defineExpression({
|
99
|
+
expressionKey: "Basic.GreaterThan",
|
100
|
+
builder: (left, right) => {
|
101
|
+
return { left, right };
|
102
|
+
},
|
103
|
+
resolver: ({ left, right }, evaluate) => {
|
104
|
+
return evaluate(left) > evaluate(right);
|
105
|
+
}
|
106
|
+
});
|
107
|
+
var GreaterThanOrEqualExpression = defineExpression({
|
108
|
+
expressionKey: "Basic.GreaterThanOrEqual",
|
109
|
+
builder: (left, right) => {
|
110
|
+
return { left, right };
|
111
|
+
},
|
112
|
+
resolver: ({ left, right }, evaluate) => {
|
113
|
+
return evaluate(left) >= evaluate(right);
|
114
|
+
}
|
115
|
+
});
|
116
|
+
export {
|
117
|
+
AndExpression,
|
118
|
+
ContainsExpression,
|
119
|
+
EqualsExpression,
|
120
|
+
GreaterThanExpression,
|
121
|
+
GreaterThanOrEqualExpression,
|
122
|
+
LessThanExpression,
|
123
|
+
LessThanOrEqualExpression,
|
124
|
+
NotExpression,
|
125
|
+
OrExpression,
|
126
|
+
ValueExpression,
|
127
|
+
VariableExpression
|
128
|
+
};
|
129
|
+
//# sourceMappingURL=core-expression.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../src/expression/core-expression.ts"],"sourcesContent":["import { defineExpression } from '@bessemer/cornerstone/expression/internal'\nimport { Expression } from '@bessemer/cornerstone/expression'\nimport { BasicType } from '@bessemer/cornerstone/types'\nimport { Arrays, Objects, Preconditions, Signatures } from '@bessemer/cornerstone'\nimport { Signable } from '@bessemer/cornerstone/signature'\n\nexport const ValueExpression = defineExpression({\n expressionKey: 'Value',\n builder: (value: unknown) => {\n return { value }\n },\n resolver: ({ value }, evaluate, context) => {\n return value\n },\n})\n\nexport const VariableExpression = defineExpression({\n expressionKey: 'Variable',\n builder: (name: string) => {\n return { name }\n },\n resolver: ({ name }, evaluate, context) => {\n const value = context.variables[name]\n Preconditions.isPresent(value)\n return value\n },\n})\n\nexport const NotExpression = defineExpression({\n expressionKey: 'Not',\n builder: (value: Expression<boolean>) => {\n return { value }\n },\n resolver: (expression, evaluate) => {\n return !evaluate(expression.value)\n },\n})\n\nexport const AndExpression = defineExpression({\n expressionKey: 'And',\n builder: (operands: Array<Expression<boolean>>) => {\n return { operands }\n },\n resolver: (expression, evaluate) => {\n const values = expression.operands.map((it) => evaluate(it))\n const falseValue = values.find((it) => !it)\n return Objects.isNil(falseValue)\n },\n})\n\nexport const OrExpression = defineExpression({\n expressionKey: 'Or',\n builder: (operands: Array<Expression<boolean>>) => {\n return { operands }\n },\n resolver: (expression, evaluate) => {\n const values = expression.operands.map((it) => evaluate(it))\n const trueValue = values.find((it) => it)\n return Objects.isPresent(trueValue)\n },\n})\n\nexport const EqualsExpression = defineExpression({\n expressionKey: 'Equals',\n builder: (operands: Array<Expression<Signable>>) => {\n return { operands }\n },\n resolver: (expression, evaluate) => {\n const values = expression.operands.map((it) => evaluate(it)).map(Signatures.sign)\n\n if (values.length === 0) {\n return true\n }\n\n const first = values[0]\n return values.every((val) => val === first)\n },\n})\n\nexport const ContainsExpression = defineExpression({\n expressionKey: 'Contains',\n builder: (collection: Expression<Array<Signable>>, operands: Array<Expression<Signable>>) => {\n return { collection, operands }\n },\n resolver: (expression, evaluate) => {\n const collection = evaluate(expression.collection)\n const values = expression.operands.map((it) => evaluate(it))\n return Arrays.containsAll(collection, values)\n },\n})\n\nexport const LessThanExpression = defineExpression({\n expressionKey: 'Basic.LessThan',\n builder: (left: Expression<BasicType>, right: Expression<BasicType>) => {\n return { left, right }\n },\n resolver: ({ left, right }, evaluate) => {\n return evaluate(left) < evaluate(right)\n },\n})\n\nexport const LessThanOrEqualExpression = defineExpression({\n expressionKey: 'Basic.LessThanOrEqual',\n builder: (left: Expression<BasicType>, right: Expression<BasicType>) => {\n return { left, right }\n },\n resolver: ({ left, right }, evaluate) => {\n return evaluate(left) <= evaluate(right)\n },\n})\n\nexport const GreaterThanExpression = defineExpression({\n expressionKey: 'Basic.GreaterThan',\n builder: (left: Expression<BasicType>, right: Expression<BasicType>) => {\n return { left, right }\n },\n resolver: ({ left, right }, evaluate) => {\n return evaluate(left) > evaluate(right)\n },\n})\n\nexport const GreaterThanOrEqualExpression = defineExpression({\n expressionKey: 'Basic.GreaterThanOrEqual',\n builder: (left: Expression<BasicType>, right: Expression<BasicType>) => {\n return { left, right }\n },\n resolver: ({ left, right }, evaluate) => {\n return evaluate(left) >= evaluate(right)\n },\n})\n"],"mappings":"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","names":[]}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"expression-mapper.d.ts","sourceRoot":"","sources":["../../src/expression/expression-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;
|
1
|
+
{"version":3,"file":"expression-mapper.d.ts","sourceRoot":"","sources":["../../src/expression/expression-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAOnF,KAAK,kBAAkB,CAAC,cAAc,EAAE,WAAW,EAAE,WAAW,IAAI,CAClE,UAAU,EAAE,cAAc,EAC1B,GAAG,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,WAAW,EACrD,OAAO,EAAE,WAAW,KACjB,WAAW,CAAA;AAEhB,qBAAa,gBAAgB,CAAC,WAAW,EAAE,WAAW;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoE;IAEhG,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,WAAW;IAqBvE,QAAQ,CAAC,cAAc,EACrB,UAAU,EAAE,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,cAAc,CAAC,EAC1D,QAAQ,EAAE,kBAAkB,CAAC,cAAc,EAAE,WAAW,EAAE,WAAW,CAAC,GACrE,IAAI;CAGR"}
|
@@ -1,7 +1,8 @@
|
|
1
1
|
// src/expression/expression-mapper.ts
|
2
2
|
import { isExpression } from "@bessemer/cornerstone/expression/internal";
|
3
3
|
import { Preconditions } from "@bessemer/cornerstone";
|
4
|
-
import { value
|
4
|
+
import { value } from "@bessemer/cornerstone/expression/expression";
|
5
|
+
import { ValueExpression } from "@bessemer/cornerstone/expression/core-expression";
|
5
6
|
var ExpressionMapper = class {
|
6
7
|
resolverMap = {};
|
7
8
|
map(expression, context) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/expression/expression-mapper.ts"],"sourcesContent":["import { Expression, ExpressionDefinition } from '@bessemer/cornerstone/expression'\nimport { Dictionary } from '@bessemer/cornerstone/types'\nimport { isExpression } from '@bessemer/cornerstone/expression/internal'\nimport { Preconditions } from '@bessemer/cornerstone'\nimport { value
|
1
|
+
{"version":3,"sources":["../../src/expression/expression-mapper.ts"],"sourcesContent":["import { Expression, ExpressionDefinition } from '@bessemer/cornerstone/expression'\nimport { Dictionary } from '@bessemer/cornerstone/types'\nimport { isExpression } from '@bessemer/cornerstone/expression/internal'\nimport { Preconditions } from '@bessemer/cornerstone'\nimport { value } from '@bessemer/cornerstone/expression/expression'\nimport { ValueExpression } from '@bessemer/cornerstone/expression/core-expression'\n\ntype ExpressionResolver<ExpressionType, MappingType, ContextType> = (\n expression: ExpressionType,\n map: (expression: Expression<unknown>) => MappingType,\n context: ContextType\n) => MappingType\n\nexport class ExpressionMapper<MappingType, ContextType> {\n private readonly resolverMap: Dictionary<ExpressionResolver<any, MappingType, ContextType>> = {}\n\n map(expression: Expression<unknown>, context: ContextType): MappingType {\n if (isExpression(expression)) {\n const resolver = this.resolverMap[expression.expressionKey]\n Preconditions.isPresent(\n resolver,\n `Illegal Argument - Attempted to map unknown expression: ${expression.expressionKey}. You must register(...) a handler for this expression type.`\n )\n\n return resolver(expression, (expression) => this.map(expression, context), context)\n } else {\n const resolver = this.resolverMap[ValueExpression.expressionKey]\n Preconditions.isPresent(\n resolver,\n `Illegal Argument - Attempted to map unknown expression: ${ValueExpression.expressionKey}. You must register(...) a handler for this expression type.`\n )\n\n const valueExpression = value(expression)\n return resolver(valueExpression, (expression) => this.map(expression, context), context)\n }\n }\n\n register<ExpressionType>(\n definition: ExpressionDefinition<any, any, ExpressionType>,\n resolver: ExpressionResolver<ExpressionType, MappingType, ContextType>\n ): void {\n this.resolverMap[definition.expressionKey] = resolver\n }\n}\n"],"mappings":";AAEA,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,aAAa;AACtB,SAAS,uBAAuB;AAQzB,IAAM,mBAAN,MAAiD;AAAA,EACrC,cAA6E,CAAC;AAAA,EAE/F,IAAI,YAAiC,SAAmC;AACtE,QAAI,aAAa,UAAU,GAAG;AAC5B,YAAM,WAAW,KAAK,YAAY,WAAW,aAAa;AAC1D,oBAAc;AAAA,QACZ;AAAA,QACA,2DAA2D,WAAW,aAAa;AAAA,MACrF;AAEA,aAAO,SAAS,YAAY,CAACA,gBAAe,KAAK,IAAIA,aAAY,OAAO,GAAG,OAAO;AAAA,IACpF,OAAO;AACL,YAAM,WAAW,KAAK,YAAY,gBAAgB,aAAa;AAC/D,oBAAc;AAAA,QACZ;AAAA,QACA,2DAA2D,gBAAgB,aAAa;AAAA,MAC1F;AAEA,YAAM,kBAAkB,MAAM,UAAU;AACxC,aAAO,SAAS,iBAAiB,CAACA,gBAAe,KAAK,IAAIA,aAAY,OAAO,GAAG,OAAO;AAAA,IACzF;AAAA,EACF;AAAA,EAEA,SACE,YACA,UACM;AACN,SAAK,YAAY,WAAW,aAAa,IAAI;AAAA,EAC/C;AACF;","names":["expression"]}
|
@@ -2,8 +2,10 @@ import { EvaluateExpression, Expression, ExpressionContext, ExpressionDefinition
|
|
2
2
|
import { Signatures } from '@bessemer/cornerstone';
|
3
3
|
import { Signable } from '@bessemer/cornerstone/signature';
|
4
4
|
import { UnknownRecord } from 'type-fest';
|
5
|
+
import { ExpressionMapper } from '@bessemer/cornerstone/expression/expression-mapper';
|
5
6
|
export declare const evaluate: <T>(expression: Expression<T>, context: ExpressionContext) => T;
|
6
7
|
export declare const evaluateDefault: <T>(expression: Expression<T>) => T;
|
8
|
+
export declare const map: <MappingType, ContextType>(expression: Expression<unknown>, mapper: ExpressionMapper<MappingType, ContextType>, context: ContextType) => MappingType;
|
7
9
|
export declare const evaluator: (context: ExpressionContext) => EvaluateExpression;
|
8
10
|
export declare const defaultEvaluator: () => EvaluateExpression;
|
9
11
|
export declare const defaultContext: () => ExpressionContext;
|
@@ -11,44 +13,38 @@ export declare const dereference: <ReturnType, ArgumentType extends Array<unknow
|
|
11
13
|
export declare const parameterizedVariable: <ValueType, ParameterType extends Array<Signable>>(name: string) => ParameterizedVariable<ValueType, ParameterType>;
|
12
14
|
export declare const buildVariable: <T>(variable: ExpressionVariable<T>, value: T) => UnknownRecord;
|
13
15
|
export declare const reference: <ReturnType, ArgumentType extends Array<unknown>, ExpressionType extends Expression<ReturnType>>(expressionDefinition: ExpressionDefinition<ReturnType, ArgumentType, ExpressionType>) => ExpressionReference<ReturnType, ArgumentType>;
|
14
|
-
export declare const ValueExpression: ExpressionDefinition<unknown, [value: unknown], {
|
15
|
-
value: unknown;
|
16
|
-
}>;
|
17
16
|
export declare const value: <T>(value: T) => Expression<T>;
|
18
|
-
export declare const VariableExpression: ExpressionDefinition<{}, [name: string], Expression<{}> & {
|
19
|
-
name: string;
|
20
|
-
}>;
|
21
17
|
export declare const variable: <T>(name: string) => ExpressionVariable<T>;
|
22
|
-
export declare const NotExpression: ExpressionDefinition<boolean, [value: Expression<boolean>], Expression<boolean> & {
|
23
|
-
value: Expression<boolean>;
|
24
|
-
}>;
|
25
18
|
export declare const not: (value: Expression<boolean>) => Expression<boolean> & {
|
26
19
|
value: Expression<boolean>;
|
27
20
|
};
|
28
|
-
export declare const AndExpression: ExpressionDefinition<boolean, [operands: Expression<boolean>[]], Expression<boolean> & {
|
29
|
-
operands: Expression<boolean>[];
|
30
|
-
}>;
|
31
21
|
export declare const and: (operands: Expression<boolean>[]) => Expression<boolean> & {
|
32
22
|
operands: Expression<boolean>[];
|
33
23
|
};
|
34
|
-
export declare const OrExpression: ExpressionDefinition<boolean, [operands: Expression<boolean>[]], Expression<boolean> & {
|
35
|
-
operands: Expression<boolean>[];
|
36
|
-
}>;
|
37
24
|
export declare const or: (operands: Expression<boolean>[]) => Expression<boolean> & {
|
38
25
|
operands: Expression<boolean>[];
|
39
26
|
};
|
40
|
-
export declare const EqualsExpression: ExpressionDefinition<boolean, [operands: Expression<Signatures.Signable>[]], Expression<boolean> & {
|
41
|
-
operands: Expression<Signatures.Signable>[];
|
42
|
-
}>;
|
43
27
|
export declare const equals: (operands: Expression<Signatures.Signable>[]) => Expression<boolean> & {
|
44
28
|
operands: Expression<Signatures.Signable>[];
|
45
29
|
};
|
46
|
-
export declare const ContainsExpression: ExpressionDefinition<boolean, [collection: Expression<Signatures.Signable[]>, operands: Expression<Signatures.Signable>[]], Expression<boolean> & {
|
47
|
-
collection: Expression<Signatures.Signable[]>;
|
48
|
-
operands: Expression<Signatures.Signable>[];
|
49
|
-
}>;
|
50
30
|
export declare const contains: (collection: Expression<Signatures.Signable[]>, operands: Expression<Signatures.Signable>[]) => Expression<boolean> & {
|
51
31
|
collection: Expression<Signatures.Signable[]>;
|
52
32
|
operands: Expression<Signatures.Signable>[];
|
53
33
|
};
|
34
|
+
export declare const lessThan: (left: Expression<import("../types").BasicType>, right: Expression<import("../types").BasicType>) => Expression<boolean> & {
|
35
|
+
left: Expression<import("../types").BasicType>;
|
36
|
+
right: Expression<import("../types").BasicType>;
|
37
|
+
};
|
38
|
+
export declare const lessThanOrEqual: (left: Expression<import("../types").BasicType>, right: Expression<import("../types").BasicType>) => Expression<boolean> & {
|
39
|
+
left: Expression<import("../types").BasicType>;
|
40
|
+
right: Expression<import("../types").BasicType>;
|
41
|
+
};
|
42
|
+
export declare const greaterThan: (left: Expression<import("../types").BasicType>, right: Expression<import("../types").BasicType>) => Expression<boolean> & {
|
43
|
+
left: Expression<import("../types").BasicType>;
|
44
|
+
right: Expression<import("../types").BasicType>;
|
45
|
+
};
|
46
|
+
export declare const greaterThanOrEqual: (left: Expression<import("../types").BasicType>, right: Expression<import("../types").BasicType>) => Expression<boolean> & {
|
47
|
+
left: Expression<import("../types").BasicType>;
|
48
|
+
right: Expression<import("../types").BasicType>;
|
49
|
+
};
|
54
50
|
//# sourceMappingURL=expression.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"expression.d.ts","sourceRoot":"","sources":["../../src/expression/expression.ts"],"names":[],"mappings":"AACA,OAAO,
|
1
|
+
{"version":3,"file":"expression.d.ts","sourceRoot":"","sources":["../../src/expression/expression.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,kBAAkB,EAClB,UAAU,EACV,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAElB,qBAAqB,EAEtB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAczC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oDAAoD,CAAA;AAErF,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,YAAY,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,iBAAiB,KAAG,CAEnF,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,YAAY,UAAU,CAAC,CAAC,CAAC,KAAG,CAE9D,CAAA;AAED,eAAO,MAAM,GAAG,GAAI,WAAW,EAAE,WAAW,EAC1C,YAAY,UAAU,CAAC,OAAO,CAAC,EAC/B,QAAQ,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,EAClD,SAAS,WAAW,KACnB,WAEF,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,SAAS,iBAAiB,KAAG,kBAEtD,CAAA;AAED,eAAO,MAAM,gBAAgB,QAAO,kBAEnC,CAAA;AAED,eAAO,MAAM,cAAc,QAAO,iBAEjC,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,UAAU,EAAE,YAAY,SAAS,KAAK,CAAC,OAAO,CAAC,EACzE,WAAW,mBAAmB,CAAC,UAAU,EAAE,YAAY,CAAC,EACxD,GAAG,MAAM,YAAY,KACpB,UAAU,CAAC,UAAU,CAEvB,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,SAAS,EAAE,aAAa,SAAS,KAAK,CAAC,QAAQ,CAAC,EACpF,MAAM,MAAM,KACX,qBAAqB,CAAC,SAAS,EAAE,aAAa,CAOhD,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,UAAU,kBAAkB,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,KAAG,aAE5E,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,UAAU,EAAE,YAAY,SAAS,KAAK,CAAC,OAAO,CAAC,EAAE,cAAc,SAAS,UAAU,CAAC,UAAU,CAAC,EACtH,sBAAsB,oBAAoB,CAAC,UAAU,EAAE,YAAY,EAAE,cAAc,CAAC,KACnF,mBAAmB,CAAC,UAAU,EAAE,YAAY,CAE9C,CAAA;AAED,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,UAAU,CAAC,CAAC,CAE/C,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,MAAM,MAAM,KAAG,kBAAkB,CAAC,CAAC,CAE9D,CAAA;AAED,eAAO,MAAM,GAAG;;CAAwB,CAAA;AAExC,eAAO,MAAM,GAAG;;CAAwB,CAAA;AAExC,eAAO,MAAM,EAAE;;CAAuB,CAAA;AAEtC,eAAO,MAAM,MAAM;;CAA2B,CAAA;AAE9C,eAAO,MAAM,QAAQ;;;CAA6B,CAAA;AAElD,eAAO,MAAM,QAAQ;;;CAA6B,CAAA;AAElD,eAAO,MAAM,eAAe;;;CAAoC,CAAA;AAEhE,eAAO,MAAM,WAAW;;;CAAgC,CAAA;AAExD,eAAO,MAAM,kBAAkB;;;CAAuC,CAAA"}
|
@@ -2,18 +2,32 @@
|
|
2
2
|
import { ExpressionEvaluator } from "@bessemer/cornerstone/expression/expression-evaluator";
|
3
3
|
import {
|
4
4
|
ArrayExpressions,
|
5
|
-
BasicExpressions,
|
6
5
|
NumericExpressions,
|
7
6
|
StringExpressions
|
8
7
|
} from "@bessemer/cornerstone/expression";
|
9
|
-
import {
|
10
|
-
import {
|
8
|
+
import { Signatures } from "@bessemer/cornerstone";
|
9
|
+
import {
|
10
|
+
AndExpression,
|
11
|
+
ContainsExpression,
|
12
|
+
EqualsExpression,
|
13
|
+
GreaterThanExpression,
|
14
|
+
GreaterThanOrEqualExpression,
|
15
|
+
LessThanExpression,
|
16
|
+
LessThanOrEqualExpression,
|
17
|
+
NotExpression,
|
18
|
+
OrExpression,
|
19
|
+
ValueExpression,
|
20
|
+
VariableExpression
|
21
|
+
} from "@bessemer/cornerstone/expression/core-expression";
|
11
22
|
var evaluate = (expression, context) => {
|
12
23
|
return new ExpressionEvaluator(DEFAULT_EXPRESSION_DEFINITIONS).evaluate(expression, context);
|
13
24
|
};
|
14
25
|
var evaluateDefault = (expression) => {
|
15
26
|
return evaluate(expression, defaultContext());
|
16
27
|
};
|
28
|
+
var map = (expression, mapper, context) => {
|
29
|
+
return mapper.map(expression, context);
|
30
|
+
};
|
17
31
|
var evaluator = (context) => {
|
18
32
|
return (it) => evaluate(it, context);
|
19
33
|
};
|
@@ -40,91 +54,21 @@ var buildVariable = (variable2, value2) => {
|
|
40
54
|
var reference = (expressionDefinition) => {
|
41
55
|
return { expressionKey: expressionDefinition.expressionKey };
|
42
56
|
};
|
43
|
-
var ValueExpression = defineExpression({
|
44
|
-
expressionKey: "Value",
|
45
|
-
builder: (value2) => {
|
46
|
-
return { value: value2 };
|
47
|
-
},
|
48
|
-
resolver: ({ value: value2 }, evaluate2, context) => {
|
49
|
-
return value2;
|
50
|
-
}
|
51
|
-
});
|
52
57
|
var value = (value2) => {
|
53
58
|
return ValueExpression.builder(value2);
|
54
59
|
};
|
55
|
-
var
|
56
|
-
|
57
|
-
|
58
|
-
return { name };
|
59
|
-
},
|
60
|
-
resolver: ({ name }, evaluate2, context) => {
|
61
|
-
const value2 = context.variables[name];
|
62
|
-
Preconditions.isPresent(value2);
|
63
|
-
return value2;
|
64
|
-
}
|
65
|
-
});
|
66
|
-
var variable = (name) => VariableExpression.builder(name);
|
67
|
-
var NotExpression = defineExpression({
|
68
|
-
expressionKey: "Not",
|
69
|
-
builder: (value2) => {
|
70
|
-
return { value: value2 };
|
71
|
-
},
|
72
|
-
resolver: (expression, evaluate2) => {
|
73
|
-
return !evaluate2(expression.value);
|
74
|
-
}
|
75
|
-
});
|
60
|
+
var variable = (name) => {
|
61
|
+
return VariableExpression.builder(name);
|
62
|
+
};
|
76
63
|
var not = NotExpression.builder;
|
77
|
-
var AndExpression = defineExpression({
|
78
|
-
expressionKey: "And",
|
79
|
-
builder: (operands) => {
|
80
|
-
return { operands };
|
81
|
-
},
|
82
|
-
resolver: (expression, evaluate2) => {
|
83
|
-
const values = expression.operands.map((it) => evaluate2(it));
|
84
|
-
const falseValue = values.find((it) => !it);
|
85
|
-
return Objects.isNil(falseValue);
|
86
|
-
}
|
87
|
-
});
|
88
64
|
var and = AndExpression.builder;
|
89
|
-
var OrExpression = defineExpression({
|
90
|
-
expressionKey: "Or",
|
91
|
-
builder: (operands) => {
|
92
|
-
return { operands };
|
93
|
-
},
|
94
|
-
resolver: (expression, evaluate2) => {
|
95
|
-
const values = expression.operands.map((it) => evaluate2(it));
|
96
|
-
const trueValue = values.find((it) => it);
|
97
|
-
return Objects.isPresent(trueValue);
|
98
|
-
}
|
99
|
-
});
|
100
65
|
var or = OrExpression.builder;
|
101
|
-
var EqualsExpression = defineExpression({
|
102
|
-
expressionKey: "Equals",
|
103
|
-
builder: (operands) => {
|
104
|
-
return { operands };
|
105
|
-
},
|
106
|
-
resolver: (expression, evaluate2) => {
|
107
|
-
const values = expression.operands.map((it) => evaluate2(it)).map(Signatures.sign);
|
108
|
-
if (values.length === 0) {
|
109
|
-
return true;
|
110
|
-
}
|
111
|
-
const first = values[0];
|
112
|
-
return values.every((val) => val === first);
|
113
|
-
}
|
114
|
-
});
|
115
66
|
var equals = EqualsExpression.builder;
|
116
|
-
var ContainsExpression = defineExpression({
|
117
|
-
expressionKey: "Contains",
|
118
|
-
builder: (collection, operands) => {
|
119
|
-
return { collection, operands };
|
120
|
-
},
|
121
|
-
resolver: (expression, evaluate2) => {
|
122
|
-
const collection = evaluate2(expression.collection);
|
123
|
-
const values = expression.operands.map((it) => evaluate2(it));
|
124
|
-
return Arrays.containsAll(collection, values);
|
125
|
-
}
|
126
|
-
});
|
127
67
|
var contains = ContainsExpression.builder;
|
68
|
+
var lessThan = LessThanExpression.builder;
|
69
|
+
var lessThanOrEqual = LessThanOrEqualExpression.builder;
|
70
|
+
var greaterThan = GreaterThanExpression.builder;
|
71
|
+
var greaterThanOrEqual = GreaterThanOrEqualExpression.builder;
|
128
72
|
var DEFAULT_EXPRESSION_DEFINITIONS = [
|
129
73
|
ValueExpression,
|
130
74
|
VariableExpression,
|
@@ -132,15 +76,15 @@ var DEFAULT_EXPRESSION_DEFINITIONS = [
|
|
132
76
|
OrExpression,
|
133
77
|
ContainsExpression,
|
134
78
|
EqualsExpression,
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
79
|
+
LessThanExpression,
|
80
|
+
LessThanOrEqualExpression,
|
81
|
+
GreaterThanExpression,
|
82
|
+
GreaterThanOrEqualExpression,
|
139
83
|
NumericExpressions.SumExpression,
|
140
84
|
NumericExpressions.MultiplyExpression,
|
141
85
|
NumericExpressions.FloorExpression,
|
142
86
|
NumericExpressions.CeilingExpression,
|
143
|
-
NumericExpressions.
|
87
|
+
NumericExpressions.BoundExpression,
|
144
88
|
NumericExpressions.RoundExpression,
|
145
89
|
NumericExpressions.MaxExpression,
|
146
90
|
NumericExpressions.MinExpression,
|
@@ -151,13 +95,6 @@ var DEFAULT_EXPRESSION_DEFINITIONS = [
|
|
151
95
|
ArrayExpressions.FirstExpression
|
152
96
|
];
|
153
97
|
export {
|
154
|
-
AndExpression,
|
155
|
-
ContainsExpression,
|
156
|
-
EqualsExpression,
|
157
|
-
NotExpression,
|
158
|
-
OrExpression,
|
159
|
-
ValueExpression,
|
160
|
-
VariableExpression,
|
161
98
|
and,
|
162
99
|
buildVariable,
|
163
100
|
contains,
|
@@ -168,6 +105,11 @@ export {
|
|
168
105
|
evaluate,
|
169
106
|
evaluateDefault,
|
170
107
|
evaluator,
|
108
|
+
greaterThan,
|
109
|
+
greaterThanOrEqual,
|
110
|
+
lessThan,
|
111
|
+
lessThanOrEqual,
|
112
|
+
map,
|
171
113
|
not,
|
172
114
|
or,
|
173
115
|
parameterizedVariable,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/expression/expression.ts"],"sourcesContent":["import { ExpressionEvaluator } from '@bessemer/cornerstone/expression/expression-evaluator'\nimport {\n ArrayExpressions,\n
|
1
|
+
{"version":3,"sources":["../../src/expression/expression.ts"],"sourcesContent":["import { ExpressionEvaluator } from '@bessemer/cornerstone/expression/expression-evaluator'\nimport {\n ArrayExpressions,\n EvaluateExpression,\n Expression,\n ExpressionContext,\n ExpressionDefinition,\n ExpressionReference,\n ExpressionVariable,\n NumericExpressions,\n ParameterizedVariable,\n StringExpressions,\n} from '@bessemer/cornerstone/expression'\nimport { Signatures } from '@bessemer/cornerstone'\nimport { Signable } from '@bessemer/cornerstone/signature'\nimport { UnknownRecord } from 'type-fest'\nimport {\n AndExpression,\n ContainsExpression,\n EqualsExpression,\n GreaterThanExpression,\n GreaterThanOrEqualExpression,\n LessThanExpression,\n LessThanOrEqualExpression,\n NotExpression,\n OrExpression,\n ValueExpression,\n VariableExpression,\n} from '@bessemer/cornerstone/expression/core-expression'\nimport { ExpressionMapper } from '@bessemer/cornerstone/expression/expression-mapper'\n\nexport const evaluate = <T>(expression: Expression<T>, context: ExpressionContext): T => {\n return new ExpressionEvaluator(DEFAULT_EXPRESSION_DEFINITIONS).evaluate(expression, context)\n}\n\nexport const evaluateDefault = <T>(expression: Expression<T>): T => {\n return evaluate(expression, defaultContext())\n}\n\nexport const map = <MappingType, ContextType>(\n expression: Expression<unknown>,\n mapper: ExpressionMapper<MappingType, ContextType>,\n context: ContextType\n): MappingType => {\n return mapper.map(expression, context)\n}\n\nexport const evaluator = (context: ExpressionContext): EvaluateExpression => {\n return (it) => evaluate(it, context)\n}\n\nexport const defaultEvaluator = (): EvaluateExpression => {\n return evaluator(defaultContext())\n}\n\nexport const defaultContext = (): ExpressionContext => {\n return { variables: {} }\n}\n\nexport const dereference = <ReturnType, ArgumentType extends Array<unknown>>(\n reference: ExpressionReference<ReturnType, ArgumentType>,\n ...args: ArgumentType\n): Expression<ReturnType> => {\n return new ExpressionEvaluator(DEFAULT_EXPRESSION_DEFINITIONS).dereference(reference, ...args)\n}\n\nexport const parameterizedVariable = <ValueType, ParameterType extends Array<Signable>>(\n name: string\n): ParameterizedVariable<ValueType, ParameterType> => {\n return {\n apply(...parameters: ParameterType): ExpressionVariable<ValueType> {\n const parameterString = parameters.map(Signatures.sign).join('.')\n return variable(`${name}.${parameterString}`)\n },\n }\n}\n\nexport const buildVariable = <T>(variable: ExpressionVariable<T>, value: T): UnknownRecord => {\n return { [variable.name]: value }\n}\n\nexport const reference = <ReturnType, ArgumentType extends Array<unknown>, ExpressionType extends Expression<ReturnType>>(\n expressionDefinition: ExpressionDefinition<ReturnType, ArgumentType, ExpressionType>\n): ExpressionReference<ReturnType, ArgumentType> => {\n return { expressionKey: expressionDefinition.expressionKey }\n}\n\nexport const value = <T>(value: T): Expression<T> => {\n return ValueExpression.builder(value) as Expression<T>\n}\n\nexport const variable = <T>(name: string): ExpressionVariable<T> => {\n return VariableExpression.builder(name) as ExpressionVariable<T>\n}\n\nexport const not = NotExpression.builder\n\nexport const and = AndExpression.builder\n\nexport const or = OrExpression.builder\n\nexport const equals = EqualsExpression.builder\n\nexport const contains = ContainsExpression.builder\n\nexport const lessThan = LessThanExpression.builder\n\nexport const lessThanOrEqual = LessThanOrEqualExpression.builder\n\nexport const greaterThan = GreaterThanExpression.builder\n\nexport const greaterThanOrEqual = GreaterThanOrEqualExpression.builder\n\nconst DEFAULT_EXPRESSION_DEFINITIONS: Array<ExpressionDefinition<unknown, Array<any>, Expression<any>>> = [\n ValueExpression,\n VariableExpression,\n AndExpression,\n OrExpression,\n ContainsExpression,\n EqualsExpression,\n LessThanExpression,\n LessThanOrEqualExpression,\n GreaterThanExpression,\n GreaterThanOrEqualExpression,\n NumericExpressions.SumExpression,\n NumericExpressions.MultiplyExpression,\n NumericExpressions.FloorExpression,\n NumericExpressions.CeilingExpression,\n NumericExpressions.BoundExpression,\n NumericExpressions.RoundExpression,\n NumericExpressions.MaxExpression,\n NumericExpressions.MinExpression,\n StringExpressions.ConcatenateExpression,\n StringExpressions.SubstringExpression,\n StringExpressions.UppercaseExpression,\n ArrayExpressions.ConcatenateExpression,\n ArrayExpressions.FirstExpression,\n]\n"],"mappings":";AAAA,SAAS,2BAA2B;AACpC;AAAA,EACE;AAAA,EAOA;AAAA,EAEA;AAAA,OACK;AACP,SAAS,kBAAkB;AAG3B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGA,IAAM,WAAW,CAAI,YAA2B,YAAkC;AACvF,SAAO,IAAI,oBAAoB,8BAA8B,EAAE,SAAS,YAAY,OAAO;AAC7F;AAEO,IAAM,kBAAkB,CAAI,eAAiC;AAClE,SAAO,SAAS,YAAY,eAAe,CAAC;AAC9C;AAEO,IAAM,MAAM,CACjB,YACA,QACA,YACgB;AAChB,SAAO,OAAO,IAAI,YAAY,OAAO;AACvC;AAEO,IAAM,YAAY,CAAC,YAAmD;AAC3E,SAAO,CAAC,OAAO,SAAS,IAAI,OAAO;AACrC;AAEO,IAAM,mBAAmB,MAA0B;AACxD,SAAO,UAAU,eAAe,CAAC;AACnC;AAEO,IAAM,iBAAiB,MAAyB;AACrD,SAAO,EAAE,WAAW,CAAC,EAAE;AACzB;AAEO,IAAM,cAAc,CACzBA,eACG,SACwB;AAC3B,SAAO,IAAI,oBAAoB,8BAA8B,EAAE,YAAYA,YAAW,GAAG,IAAI;AAC/F;AAEO,IAAM,wBAAwB,CACnC,SACoD;AACpD,SAAO;AAAA,IACL,SAAS,YAA0D;AACjE,YAAM,kBAAkB,WAAW,IAAI,WAAW,IAAI,EAAE,KAAK,GAAG;AAChE,aAAO,SAAS,GAAG,IAAI,IAAI,eAAe,EAAE;AAAA,IAC9C;AAAA,EACF;AACF;AAEO,IAAM,gBAAgB,CAAIC,WAAiCC,WAA4B;AAC5F,SAAO,EAAE,CAACD,UAAS,IAAI,GAAGC,OAAM;AAClC;AAEO,IAAM,YAAY,CACvB,yBACkD;AAClD,SAAO,EAAE,eAAe,qBAAqB,cAAc;AAC7D;AAEO,IAAM,QAAQ,CAAIA,WAA4B;AACnD,SAAO,gBAAgB,QAAQA,MAAK;AACtC;AAEO,IAAM,WAAW,CAAI,SAAwC;AAClE,SAAO,mBAAmB,QAAQ,IAAI;AACxC;AAEO,IAAM,MAAM,cAAc;AAE1B,IAAM,MAAM,cAAc;AAE1B,IAAM,KAAK,aAAa;AAExB,IAAM,SAAS,iBAAiB;AAEhC,IAAM,WAAW,mBAAmB;AAEpC,IAAM,WAAW,mBAAmB;AAEpC,IAAM,kBAAkB,0BAA0B;AAElD,IAAM,cAAc,sBAAsB;AAE1C,IAAM,qBAAqB,6BAA6B;AAE/D,IAAM,iCAAoG;AAAA,EACxG;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,iBAAiB;AACnB;","names":["reference","variable","value"]}
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import { Expression } from '@bessemer/cornerstone/expression';
|
2
2
|
import { Maths } from '@bessemer/cornerstone';
|
3
|
+
import { Bounds } from '@bessemer/cornerstone/range';
|
3
4
|
export declare const SumExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<number, [initialOperands: Expression<number>[]], Expression<number> & {
|
4
5
|
operands: Expression<number>[];
|
5
6
|
}>;
|
@@ -12,15 +13,13 @@ export declare const MultiplyExpression: import("@bessemer/cornerstone/expressio
|
|
12
13
|
export declare const multiply: (initialOperands: Expression<number>[]) => Expression<number> & {
|
13
14
|
operands: Expression<number>[];
|
14
15
|
};
|
15
|
-
export declare const
|
16
|
+
export declare const BoundExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<number, [value: Expression<number>, bounds: Bounds<Expression<number>>], Expression<number> & {
|
16
17
|
value: Expression<number>;
|
17
|
-
|
18
|
-
maximumThreshold: Expression<number> | null;
|
18
|
+
bounds: Bounds<Expression<number>>;
|
19
19
|
}>;
|
20
|
-
export declare const
|
20
|
+
export declare const bound: (value: Expression<number>, bounds: Bounds<Expression<number>>) => Expression<number> & {
|
21
21
|
value: Expression<number>;
|
22
|
-
|
23
|
-
maximumThreshold: Expression<number> | null;
|
22
|
+
bounds: Bounds<Expression<number>>;
|
24
23
|
};
|
25
24
|
export declare const FloorExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<number, [value: Expression<number>, minimumThreshold: Expression<number> | null], Expression<number> & {
|
26
25
|
value: Expression<number>;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"numeric-expression.d.ts","sourceRoot":"","sources":["../../src/expression/numeric-expression.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAC7D,OAAO,EAAE,KAAK,EAAW,MAAM,uBAAuB,CAAA;
|
1
|
+
{"version":3,"file":"numeric-expression.d.ts","sourceRoot":"","sources":["../../src/expression/numeric-expression.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAC7D,OAAO,EAAE,KAAK,EAAW,MAAM,uBAAuB,CAAA;AAEtD,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAA;AAEpD,eAAO,MAAM,aAAa;;EAiBxB,CAAA;AAEF,eAAO,MAAM,GAAG;;CAAwB,CAAA;AAExC,eAAO,MAAM,kBAAkB;;EAiB7B,CAAA;AAEF,eAAO,MAAM,QAAQ;;CAA6B,CAAA;AAElD,eAAO,MAAM,eAAe;;;EAmB1B,CAAA;AAEF,eAAO,MAAM,KAAK;;;CAA0B,CAAA;AAE5C,eAAO,MAAM,eAAe;;;EAc1B,CAAA;AAEF,eAAO,MAAM,KAAK;;;CAA0B,CAAA;AAE5C,eAAO,MAAM,iBAAiB;;;EAc5B,CAAA;AAEF,eAAO,MAAM,OAAO;;;CAA4B,CAAA;AAEhD,eAAO,MAAM,eAAe;;;;EAQ1B,CAAA;AAEF,eAAO,MAAM,KAAK;;;;CAA0B,CAAA;AAE5C,eAAO,MAAM,aAAa;;EAiBxB,CAAA;AAEF,eAAO,MAAM,GAAG;;CAAwB,CAAA;AAExC,eAAO,MAAM,aAAa;;EAiBxB,CAAA;AAEF,eAAO,MAAM,GAAG;;CAAwB,CAAA"}
|
@@ -37,15 +37,15 @@ var MultiplyExpression = defineExpression({
|
|
37
37
|
}
|
38
38
|
});
|
39
39
|
var multiply = MultiplyExpression.builder;
|
40
|
-
var
|
41
|
-
expressionKey: "Numeric.
|
42
|
-
builder: (value,
|
43
|
-
return { value,
|
40
|
+
var BoundExpression = defineExpression({
|
41
|
+
expressionKey: "Numeric.Bound",
|
42
|
+
builder: (value, bounds) => {
|
43
|
+
return { value, bounds };
|
44
44
|
},
|
45
45
|
resolver: (expression, evaluate) => {
|
46
46
|
let value = evaluate(expression.value);
|
47
|
-
const minimumThreshold = Objects.isPresent(expression.
|
48
|
-
const maximumThreshold = Objects.isPresent(expression.
|
47
|
+
const minimumThreshold = Objects.isPresent(expression.bounds[0]) ? evaluate(expression.bounds[0]) : null;
|
48
|
+
const maximumThreshold = Objects.isPresent(expression.bounds[1]) ? evaluate(expression.bounds[1]) : null;
|
49
49
|
if (Objects.isPresent(minimumThreshold) && value < minimumThreshold) {
|
50
50
|
value = minimumThreshold;
|
51
51
|
}
|
@@ -55,7 +55,7 @@ var BoundsExpression = defineExpression({
|
|
55
55
|
return value;
|
56
56
|
}
|
57
57
|
});
|
58
|
-
var
|
58
|
+
var bound = BoundExpression.builder;
|
59
59
|
var FloorExpression = defineExpression({
|
60
60
|
expressionKey: "Numeric.Floor",
|
61
61
|
builder: (value, minimumThreshold) => {
|
@@ -133,7 +133,7 @@ var MaxExpression = defineExpression({
|
|
133
133
|
});
|
134
134
|
var max = MaxExpression.builder;
|
135
135
|
export {
|
136
|
-
|
136
|
+
BoundExpression,
|
137
137
|
CeilingExpression,
|
138
138
|
FloorExpression,
|
139
139
|
MaxExpression,
|
@@ -141,7 +141,7 @@ export {
|
|
141
141
|
MultiplyExpression,
|
142
142
|
RoundExpression,
|
143
143
|
SumExpression,
|
144
|
-
|
144
|
+
bound,
|
145
145
|
ceiling,
|
146
146
|
floor,
|
147
147
|
max,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/expression/numeric-expression.ts"],"sourcesContent":["import { defineExpression, isType } from '@bessemer/cornerstone/expression/internal'\nimport { Expression } from '@bessemer/cornerstone/expression'\nimport { Maths, Objects } from '@bessemer/cornerstone'\nimport { RoundingMode } from '@bessemer/cornerstone/math'\n\nexport const SumExpression = defineExpression({\n expressionKey: 'Numeric.Sum',\n builder: (initialOperands: Array<Expression<number>>) => {\n const operands: Array<Expression<number>> = initialOperands.flatMap((it) => {\n if (isType(it, SumExpression)) {\n return it.operands\n } else {\n return [it]\n }\n })\n\n return { operands }\n },\n resolver: ({ operands }, evaluate) => {\n const values = operands.map((it) => evaluate(it))\n return values.reduce((x, y) => x + y, 0)\n },\n})\n\nexport const sum = SumExpression.builder\n\nexport const MultiplyExpression = defineExpression({\n expressionKey: 'Numeric.Multiply',\n builder: (initialOperands: Array<Expression<number>>) => {\n const operands: Array<Expression<number>> = initialOperands.flatMap((it) => {\n if (isType(it, MultiplyExpression)) {\n return it.operands\n } else {\n return [it]\n }\n })\n\n return { operands }\n },\n resolver: ({ operands }, evaluate) => {\n const values = operands.map((it) => evaluate(it))\n return values.reduce((x, y) => x * y, 1)\n },\n})\n\nexport const multiply = MultiplyExpression.builder\n\
|
1
|
+
{"version":3,"sources":["../../src/expression/numeric-expression.ts"],"sourcesContent":["import { defineExpression, isType } from '@bessemer/cornerstone/expression/internal'\nimport { Expression } from '@bessemer/cornerstone/expression'\nimport { Maths, Objects } from '@bessemer/cornerstone'\nimport { RoundingMode } from '@bessemer/cornerstone/math'\nimport { Bounds } from '@bessemer/cornerstone/range'\n\nexport const SumExpression = defineExpression({\n expressionKey: 'Numeric.Sum',\n builder: (initialOperands: Array<Expression<number>>) => {\n const operands: Array<Expression<number>> = initialOperands.flatMap((it) => {\n if (isType(it, SumExpression)) {\n return it.operands\n } else {\n return [it]\n }\n })\n\n return { operands }\n },\n resolver: ({ operands }, evaluate) => {\n const values = operands.map((it) => evaluate(it))\n return values.reduce((x, y) => x + y, 0)\n },\n})\n\nexport const sum = SumExpression.builder\n\nexport const MultiplyExpression = defineExpression({\n expressionKey: 'Numeric.Multiply',\n builder: (initialOperands: Array<Expression<number>>) => {\n const operands: Array<Expression<number>> = initialOperands.flatMap((it) => {\n if (isType(it, MultiplyExpression)) {\n return it.operands\n } else {\n return [it]\n }\n })\n\n return { operands }\n },\n resolver: ({ operands }, evaluate) => {\n const values = operands.map((it) => evaluate(it))\n return values.reduce((x, y) => x * y, 1)\n },\n})\n\nexport const multiply = MultiplyExpression.builder\n\nexport const BoundExpression = defineExpression({\n expressionKey: 'Numeric.Bound',\n builder: (value: Expression<number>, bounds: Bounds<Expression<number>>) => {\n return { value, bounds }\n },\n resolver: (expression, evaluate) => {\n let value = evaluate(expression.value)\n const minimumThreshold = Objects.isPresent(expression.bounds[0]) ? evaluate(expression.bounds[0]) : null\n const maximumThreshold = Objects.isPresent(expression.bounds[1]) ? evaluate(expression.bounds[1]) : null\n\n if (Objects.isPresent(minimumThreshold) && value < minimumThreshold) {\n value = minimumThreshold\n }\n if (Objects.isPresent(maximumThreshold) && value > maximumThreshold) {\n value = maximumThreshold\n }\n\n return value\n },\n})\n\nexport const bound = BoundExpression.builder\n\nexport const FloorExpression = defineExpression({\n expressionKey: 'Numeric.Floor',\n builder: (value: Expression<number>, minimumThreshold: Expression<number> | null) => {\n return { value, minimumThreshold }\n },\n resolver: (expression, evaluate) => {\n let value = evaluate(expression.value)\n const minimumThreshold = Objects.isPresent(expression.minimumThreshold) ? evaluate(expression.minimumThreshold) : null\n if (Objects.isPresent(minimumThreshold) && value < minimumThreshold) {\n value = minimumThreshold\n }\n\n return value\n },\n})\n\nexport const floor = FloorExpression.builder\n\nexport const CeilingExpression = defineExpression({\n expressionKey: 'Numeric.Ceiling',\n builder: (value: Expression<number>, maximumThreshold: Expression<number> | null) => {\n return { value, maximumThreshold }\n },\n resolver: (expression, evaluate) => {\n let value = evaluate(expression.value)\n const maximumThreshold = Objects.isPresent(expression.maximumThreshold) ? evaluate(expression.maximumThreshold) : null\n if (Objects.isPresent(maximumThreshold) && value > maximumThreshold) {\n value = maximumThreshold\n }\n\n return value\n },\n})\n\nexport const ceiling = CeilingExpression.builder\n\nexport const RoundExpression = defineExpression({\n expressionKey: 'Numeric.Round',\n builder: (value: Expression<number>, scale: number, roundingMode: RoundingMode) => {\n return { value, scale, roundingMode }\n },\n resolver: ({ value, scale, roundingMode }, evaluate) => {\n return Maths.round(evaluate(value), scale, roundingMode)\n },\n})\n\nexport const round = RoundExpression.builder\n\nexport const MinExpression = defineExpression({\n expressionKey: 'Numeric.Min',\n builder: (initialOperands: Array<Expression<number>>) => {\n const operands: Array<Expression<number>> = initialOperands.flatMap((it) => {\n if (isType(it, MinExpression)) {\n return it.operands\n } else {\n return [it]\n }\n })\n\n return { operands }\n },\n resolver: ({ operands }, evaluate) => {\n const values = operands.map((it) => evaluate(it))\n return Math.min(...values)\n },\n})\n\nexport const min = MinExpression.builder\n\nexport const MaxExpression = defineExpression({\n expressionKey: 'Numeric.Max',\n builder: (initialOperands: Array<Expression<number>>) => {\n const operands: Array<Expression<number>> = initialOperands.flatMap((it) => {\n if (isType(it, MaxExpression)) {\n return it.operands\n } else {\n return [it]\n }\n })\n\n return { operands }\n },\n resolver: ({ operands }, evaluate) => {\n const values = operands.map((it) => evaluate(it))\n return Math.max(...values)\n },\n})\n\nexport const max = MaxExpression.builder\n"],"mappings":"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","names":[]}
|
package/dist/expression.d.ts
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
import * as BasicExpressions from '@bessemer/cornerstone/expression/basic-expression';
|
2
1
|
import * as NumericExpressions from '@bessemer/cornerstone/expression/numeric-expression';
|
3
2
|
import * as StringExpressions from '@bessemer/cornerstone/expression/string-expression';
|
4
3
|
import * as ArrayExpressions from '@bessemer/cornerstone/expression/array-expression';
|
@@ -6,7 +5,7 @@ import * as Expressions from '@bessemer/cornerstone/expression/expression';
|
|
6
5
|
import { NominalType } from '@bessemer/cornerstone/types';
|
7
6
|
import { Signable } from '@bessemer/cornerstone/signature';
|
8
7
|
import { UnknownRecord } from 'type-fest';
|
9
|
-
export { Expressions,
|
8
|
+
export { Expressions, NumericExpressions, StringExpressions, ArrayExpressions };
|
10
9
|
export type ExpressionKey<ReturnType, ArgumentType extends Array<unknown>> = NominalType<string, ['ExpressionKey', ReturnType, ArgumentType]>;
|
11
10
|
export type Expression<ReturnType> = ReturnType | IExpression<ReturnType>;
|
12
11
|
export interface IExpression<ReturnType> {
|
package/dist/expression.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"expression.d.ts","sourceRoot":"","sources":["../src/expression.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
1
|
+
{"version":3,"file":"expression.d.ts","sourceRoot":"","sources":["../src/expression.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,kBAAkB,MAAM,qDAAqD,CAAA;AACzF,OAAO,KAAK,iBAAiB,MAAM,oDAAoD,CAAA;AACvF,OAAO,KAAK,gBAAgB,MAAM,mDAAmD,CAAA;AACrF,OAAO,KAAK,WAAW,MAAM,6CAA6C,CAAA;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAEzC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;AAE/E,MAAM,MAAM,aAAa,CAAC,UAAU,EAAE,YAAY,SAAS,KAAK,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC,eAAe,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAA;AAE7I,MAAM,MAAM,UAAU,CAAC,UAAU,IAAI,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,CAAA;AAEzE,MAAM,WAAW,WAAW,CAAC,UAAU;IACrC,aAAa,EAAE,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAA;CACzD;AAED,MAAM,WAAW,mBAAmB,CAAC,UAAU,EAAE,YAAY,SAAS,KAAK,CAAC,OAAO,CAAC;IAClF,aAAa,EAAE,aAAa,CAAC,UAAU,EAAE,YAAY,CAAC,CAAA;CACvD;AAED,MAAM,WAAW,kBAAkB,CAAC,UAAU,EAAE,YAAY,CAAE,SAAQ,mBAAmB,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;CAAG;AAE3I,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;AAEpE,MAAM,MAAM,oBAAoB,CAC9B,UAAU,EACV,YAAY,SAAS,KAAK,CAAC,OAAO,CAAC,EACnC,cAAc,SAAS,UAAU,CAAC,UAAU,CAAC,IAC3C,mBAAmB,CAAC,UAAU,EAAE,YAAY,CAAC,GAAG;IAClD,aAAa,EAAE,aAAa,CAAC,UAAU,EAAE,YAAY,CAAC,CAAA;IACtD,OAAO,EAAE,CAAC,GAAG,UAAU,EAAE,YAAY,KAAK,cAAc,CAAA;IACxD,QAAQ,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,kBAAkB,EAAE,OAAO,EAAE,iBAAiB,KAAK,UAAU,CAAA;CAC/G,CAAA;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,CAAC;IAC3D,aAAa,EAAE,UAAU,CAAA;IACzB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,qBAAqB,CAAC,SAAS,EAAE,aAAa,SAAS,KAAK,CAAC,QAAQ,CAAC;IACrF,KAAK,CAAC,GAAG,UAAU,EAAE,aAAa,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAA;CACnE;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,aAAa,CAAA;CACzB,CAAA"}
|
package/dist/expression.js
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
// src/expression.ts
|
2
|
-
import * as BasicExpressions from "@bessemer/cornerstone/expression/basic-expression";
|
3
2
|
import * as NumericExpressions from "@bessemer/cornerstone/expression/numeric-expression";
|
4
3
|
import * as StringExpressions from "@bessemer/cornerstone/expression/string-expression";
|
5
4
|
import * as ArrayExpressions from "@bessemer/cornerstone/expression/array-expression";
|
6
5
|
import * as Expressions from "@bessemer/cornerstone/expression/expression";
|
7
6
|
export {
|
8
7
|
ArrayExpressions,
|
9
|
-
BasicExpressions,
|
10
8
|
Expressions,
|
11
9
|
NumericExpressions,
|
12
10
|
StringExpressions
|
package/dist/expression.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/expression.ts"],"sourcesContent":["import * as
|
1
|
+
{"version":3,"sources":["../src/expression.ts"],"sourcesContent":["import * as NumericExpressions from '@bessemer/cornerstone/expression/numeric-expression'\nimport * as StringExpressions from '@bessemer/cornerstone/expression/string-expression'\nimport * as ArrayExpressions from '@bessemer/cornerstone/expression/array-expression'\nimport * as Expressions from '@bessemer/cornerstone/expression/expression'\nimport { NominalType } from '@bessemer/cornerstone/types'\nimport { Signable } from '@bessemer/cornerstone/signature'\nimport { UnknownRecord } from 'type-fest'\n\nexport { Expressions, NumericExpressions, StringExpressions, ArrayExpressions }\n\nexport type ExpressionKey<ReturnType, ArgumentType extends Array<unknown>> = NominalType<string, ['ExpressionKey', ReturnType, ArgumentType]>\n\nexport type Expression<ReturnType> = ReturnType | IExpression<ReturnType>\n\nexport interface IExpression<ReturnType> {\n expressionKey: ExpressionKey<ReturnType, Array<unknown>>\n}\n\nexport interface ExpressionReference<ReturnType, ArgumentType extends Array<unknown>> {\n expressionKey: ExpressionKey<ReturnType, ArgumentType>\n}\n\nexport interface ReducingExpression<ReturnType, ArgumentType> extends ExpressionReference<ReturnType, [Array<Expression<ArgumentType>>]> {}\n\nexport type EvaluateExpression = <T>(expression: Expression<T>) => T\n\nexport type ExpressionDefinition<\n ReturnType,\n ArgumentType extends Array<unknown>,\n ExpressionType extends Expression<ReturnType>\n> = ExpressionReference<ReturnType, ArgumentType> & {\n expressionKey: ExpressionKey<ReturnType, ArgumentType>\n builder: (...parameters: ArgumentType) => ExpressionType\n resolver: (expression: ExpressionType, evaluate: EvaluateExpression, context: ExpressionContext) => ReturnType\n}\n\nexport interface ExpressionVariable<T> extends IExpression<T> {\n expressionKey: 'Variable'\n name: string\n}\n\nexport interface ParameterizedVariable<ValueType, ParameterType extends Array<Signable>> {\n apply(...parameters: ParameterType): ExpressionVariable<ValueType>\n}\n\nexport type ExpressionContext = {\n variables: UnknownRecord\n}\n"],"mappings":";AAAA,YAAY,wBAAwB;AACpC,YAAY,uBAAuB;AACnC,YAAY,sBAAsB;AAClC,YAAY,iBAAiB;","names":[]}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import { ExpressionMapper } from '@bessemer/cornerstone/expression/expression-mapper';
|
2
|
+
import { Dictionary } from '@bessemer/cornerstone/types';
|
3
|
+
import { SqlFragment, SqlParameterMap } from '@bessemer/cornerstone/sql';
|
4
|
+
export type SqlExpressionParserContext = {
|
5
|
+
variables: Dictionary<string>;
|
6
|
+
parameters: SqlParameterMap;
|
7
|
+
};
|
8
|
+
export declare class SqlExpressionParser extends ExpressionMapper<SqlFragment, SqlExpressionParserContext> {
|
9
|
+
}
|
10
|
+
export declare const DefaultSqlExpressionParser: SqlExpressionParser;
|
11
|
+
//# sourceMappingURL=sql-expression-parser.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"sql-expression-parser.d.ts","sourceRoot":"","sources":["../../src/sql/sql-expression-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oDAAoD,CAAA;AAErF,OAAO,EAAa,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAenE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAExE,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;IAC7B,UAAU,EAAE,eAAe,CAAA;CAC5B,CAAA;AACD,qBAAa,mBAAoB,SAAQ,gBAAgB,CAAC,WAAW,EAAE,0BAA0B,CAAC;CAAG;AAErG,eAAO,MAAM,0BAA0B,qBAA4B,CAAA"}
|
@@ -0,0 +1,108 @@
|
|
1
|
+
// src/sql/sql-expression-parser.ts
|
2
|
+
import { ExpressionMapper } from "@bessemer/cornerstone/expression/expression-mapper";
|
3
|
+
import { Arrays, Objects, Preconditions, Ulids } from "@bessemer/cornerstone";
|
4
|
+
import {
|
5
|
+
AndExpression,
|
6
|
+
ContainsExpression,
|
7
|
+
EqualsExpression,
|
8
|
+
GreaterThanExpression,
|
9
|
+
GreaterThanOrEqualExpression,
|
10
|
+
LessThanExpression,
|
11
|
+
LessThanOrEqualExpression,
|
12
|
+
NotExpression,
|
13
|
+
OrExpression,
|
14
|
+
ValueExpression,
|
15
|
+
VariableExpression
|
16
|
+
} from "@bessemer/cornerstone/expression/core-expression";
|
17
|
+
import { isType, isValue } from "@bessemer/cornerstone/expression/internal";
|
18
|
+
var SqlExpressionParser = class extends ExpressionMapper {
|
19
|
+
};
|
20
|
+
var DefaultSqlExpressionParser = new SqlExpressionParser();
|
21
|
+
DefaultSqlExpressionParser.register(ValueExpression, (expression, _, context) => {
|
22
|
+
const value = expression.value;
|
23
|
+
const parameterName = `_${Ulids.generate()}`;
|
24
|
+
if (!Objects.isBasic(value)) {
|
25
|
+
throw new Error(`SqlExpressionParser - Unable to resolve complex ValueExpression as Sql: ${JSON.stringify(value)}`);
|
26
|
+
}
|
27
|
+
context.parameters[parameterName] = value;
|
28
|
+
return `:${parameterName}`;
|
29
|
+
});
|
30
|
+
DefaultSqlExpressionParser.register(VariableExpression, (expression, _, context) => {
|
31
|
+
const variableName = context.variables[expression.name];
|
32
|
+
Preconditions.isPresent(variableName, `SqlExpressionParser - Unable to resolve VariableExpression with name: ${expression.name}`);
|
33
|
+
return variableName;
|
34
|
+
});
|
35
|
+
DefaultSqlExpressionParser.register(NotExpression, (expression, map, context) => {
|
36
|
+
if (isType(expression.value, ContainsExpression)) {
|
37
|
+
const collection = expression.value.collection;
|
38
|
+
let value = [];
|
39
|
+
if (isType(collection, ValueExpression)) {
|
40
|
+
value = collection.value;
|
41
|
+
} else if (isValue(collection)) {
|
42
|
+
value = collection;
|
43
|
+
} else {
|
44
|
+
throw new Error(`SqlExpressionParser - Unable to resolve ContainsExpression with non-value collection: ${JSON.stringify(collection)}`);
|
45
|
+
}
|
46
|
+
value.forEach((it) => {
|
47
|
+
if (!Objects.isBasic(it)) {
|
48
|
+
throw new Error(`SqlExpressionParser - Unable to resolve complex ValueExpression as Sql: ${JSON.stringify(it)}`);
|
49
|
+
}
|
50
|
+
});
|
51
|
+
const parameterName = `_${Ulids.generate()}`;
|
52
|
+
context.parameters[parameterName] = value;
|
53
|
+
const containsExpression = expression.value.operands.map(map).map((sql) => `(${sql} NOT IN :${parameterName})`).join(" AND ");
|
54
|
+
return `(${containsExpression})`;
|
55
|
+
} else {
|
56
|
+
return `(NOT ${map(expression.value)})`;
|
57
|
+
}
|
58
|
+
});
|
59
|
+
DefaultSqlExpressionParser.register(AndExpression, (expression, map) => {
|
60
|
+
return `(${expression.operands.map(map).join(" AND ")})`;
|
61
|
+
});
|
62
|
+
DefaultSqlExpressionParser.register(OrExpression, (expression, map) => {
|
63
|
+
return `(${expression.operands.map(map).join(" OR ")})`;
|
64
|
+
});
|
65
|
+
DefaultSqlExpressionParser.register(EqualsExpression, (expression, map) => {
|
66
|
+
const first = Arrays.first(expression.operands);
|
67
|
+
const rest = Arrays.rest(expression.operands);
|
68
|
+
const mappedFirst = map(first);
|
69
|
+
const equalsExpressions = rest.map((it) => `(${mappedFirst} = ${map(it)})`).join(" AND ");
|
70
|
+
return `(${equalsExpressions})`;
|
71
|
+
});
|
72
|
+
DefaultSqlExpressionParser.register(ContainsExpression, (expression, map, context) => {
|
73
|
+
const collection = expression.collection;
|
74
|
+
let value = [];
|
75
|
+
if (isType(collection, ValueExpression)) {
|
76
|
+
value = collection.value;
|
77
|
+
} else if (isValue(collection)) {
|
78
|
+
value = collection;
|
79
|
+
} else {
|
80
|
+
throw new Error(`SqlExpressionParser - Unable to resolve ContainsExpression with non-value collection: ${JSON.stringify(collection)}`);
|
81
|
+
}
|
82
|
+
value.forEach((it) => {
|
83
|
+
if (!Objects.isBasic(it)) {
|
84
|
+
throw new Error(`SqlExpressionParser - Unable to resolve complex ValueExpression as Sql: ${JSON.stringify(it)}`);
|
85
|
+
}
|
86
|
+
});
|
87
|
+
const parameterName = `_${Ulids.generate()}`;
|
88
|
+
context.parameters[parameterName] = value;
|
89
|
+
const containsExpression = expression.operands.map(map).map((sql) => `(${sql} IN :${parameterName})`).join(" AND ");
|
90
|
+
return `(${containsExpression})`;
|
91
|
+
});
|
92
|
+
DefaultSqlExpressionParser.register(LessThanExpression, (expression, map) => {
|
93
|
+
return `(${map(expression.left)} < ${map(expression.right)})`;
|
94
|
+
});
|
95
|
+
DefaultSqlExpressionParser.register(LessThanOrEqualExpression, (expression, map) => {
|
96
|
+
return `(${map(expression.left)} <= ${map(expression.right)})`;
|
97
|
+
});
|
98
|
+
DefaultSqlExpressionParser.register(GreaterThanExpression, (expression, map) => {
|
99
|
+
return `(${map(expression.left)} > ${map(expression.right)})`;
|
100
|
+
});
|
101
|
+
DefaultSqlExpressionParser.register(GreaterThanOrEqualExpression, (expression, map) => {
|
102
|
+
return `(${map(expression.left)} >= ${map(expression.right)})`;
|
103
|
+
});
|
104
|
+
export {
|
105
|
+
DefaultSqlExpressionParser,
|
106
|
+
SqlExpressionParser
|
107
|
+
};
|
108
|
+
//# sourceMappingURL=sql-expression-parser.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../src/sql/sql-expression-parser.ts"],"sourcesContent":["import { ExpressionMapper } from '@bessemer/cornerstone/expression/expression-mapper'\nimport { Arrays, Objects, Preconditions, Ulids } from '@bessemer/cornerstone'\nimport { BasicType, Dictionary } from '@bessemer/cornerstone/types'\nimport {\n AndExpression,\n ContainsExpression,\n EqualsExpression,\n GreaterThanExpression,\n GreaterThanOrEqualExpression,\n LessThanExpression,\n LessThanOrEqualExpression,\n NotExpression,\n OrExpression,\n ValueExpression,\n VariableExpression,\n} from '@bessemer/cornerstone/expression/core-expression'\nimport { isType, isValue } from '@bessemer/cornerstone/expression/internal'\nimport { SqlFragment, SqlParameterMap } from '@bessemer/cornerstone/sql'\n\nexport type SqlExpressionParserContext = {\n variables: Dictionary<string>\n parameters: SqlParameterMap\n}\nexport class SqlExpressionParser extends ExpressionMapper<SqlFragment, SqlExpressionParserContext> {}\n\nexport const DefaultSqlExpressionParser = new SqlExpressionParser()\nDefaultSqlExpressionParser.register(ValueExpression, (expression, _, context) => {\n const value = expression.value\n const parameterName = `_${Ulids.generate()}`\n if (!Objects.isBasic(value)) {\n throw new Error(`SqlExpressionParser - Unable to resolve complex ValueExpression as Sql: ${JSON.stringify(value)}`)\n }\n\n context.parameters[parameterName] = value\n return `:${parameterName}`\n})\nDefaultSqlExpressionParser.register(VariableExpression, (expression, _, context) => {\n const variableName = context.variables[expression.name]\n Preconditions.isPresent(variableName, `SqlExpressionParser - Unable to resolve VariableExpression with name: ${expression.name}`)\n return variableName\n})\nDefaultSqlExpressionParser.register(NotExpression, (expression, map, context) => {\n if (isType(expression.value, ContainsExpression)) {\n // JOHN tons of gross duplicated code that is duped across the contains resolver\n const collection = expression.value.collection\n\n // JOHN parsing expressions like this should be easier...\n let value: Array<BasicType> = []\n if (isType(collection, ValueExpression)) {\n value = collection.value as Array<BasicType>\n } else if (isValue(collection)) {\n value = collection as Array<BasicType>\n } else {\n throw new Error(`SqlExpressionParser - Unable to resolve ContainsExpression with non-value collection: ${JSON.stringify(collection)}`)\n }\n\n value.forEach((it) => {\n if (!Objects.isBasic(it)) {\n throw new Error(`SqlExpressionParser - Unable to resolve complex ValueExpression as Sql: ${JSON.stringify(it)}`)\n }\n })\n\n const parameterName = `_${Ulids.generate()}`\n context.parameters[parameterName] = value\n\n const containsExpression = expression.value.operands\n .map(map)\n .map((sql) => `(${sql} NOT IN :${parameterName})`)\n .join(' AND ')\n\n return `(${containsExpression})`\n } else {\n return `(NOT ${map(expression.value)})`\n }\n})\nDefaultSqlExpressionParser.register(AndExpression, (expression, map) => {\n return `(${expression.operands.map(map).join(' AND ')})`\n})\nDefaultSqlExpressionParser.register(OrExpression, (expression, map) => {\n return `(${expression.operands.map(map).join(' OR ')})`\n})\nDefaultSqlExpressionParser.register(EqualsExpression, (expression, map) => {\n const first = Arrays.first(expression.operands)!\n const rest = Arrays.rest(expression.operands)\n\n const mappedFirst = map(first)\n const equalsExpressions = rest.map((it) => `(${mappedFirst} = ${map(it)})`).join(' AND ')\n return `(${equalsExpressions})`\n})\nDefaultSqlExpressionParser.register(ContainsExpression, (expression, map, context) => {\n const collection = expression.collection\n\n // JOHN parsing expressions like this should be easier...\n let value: Array<BasicType> = []\n if (isType(collection, ValueExpression)) {\n value = collection.value as Array<BasicType>\n } else if (isValue(collection)) {\n value = collection as Array<BasicType>\n } else {\n throw new Error(`SqlExpressionParser - Unable to resolve ContainsExpression with non-value collection: ${JSON.stringify(collection)}`)\n }\n\n value.forEach((it) => {\n if (!Objects.isBasic(it)) {\n throw new Error(`SqlExpressionParser - Unable to resolve complex ValueExpression as Sql: ${JSON.stringify(it)}`)\n }\n })\n\n const parameterName = `_${Ulids.generate()}`\n context.parameters[parameterName] = value\n\n const containsExpression = expression.operands\n .map(map)\n .map((sql) => `(${sql} IN :${parameterName})`)\n .join(' AND ')\n\n return `(${containsExpression})`\n})\nDefaultSqlExpressionParser.register(LessThanExpression, (expression, map) => {\n return `(${map(expression.left)} < ${map(expression.right)})`\n})\nDefaultSqlExpressionParser.register(LessThanOrEqualExpression, (expression, map) => {\n return `(${map(expression.left)} <= ${map(expression.right)})`\n})\nDefaultSqlExpressionParser.register(GreaterThanExpression, (expression, map) => {\n return `(${map(expression.left)} > ${map(expression.right)})`\n})\nDefaultSqlExpressionParser.register(GreaterThanOrEqualExpression, (expression, map) => {\n return `(${map(expression.left)} >= ${map(expression.right)})`\n})\n"],"mappings":"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","names":[]}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
import { Expression } from '@bessemer/cornerstone/expression';
|
2
|
+
import { SqlExpressionParser } from '@bessemer/cornerstone/sql/sql-expression-parser';
|
3
|
+
import { Dictionary } from '@bessemer/cornerstone/types';
|
4
|
+
import { SqlFragment, SqlParameterMap } from '@bessemer/cornerstone/sql';
|
5
|
+
export declare const fragment: (fragment: string) => SqlFragment;
|
6
|
+
export declare const parseExpression: (expression: Expression<unknown>, variableMap: Dictionary<string>, parser?: SqlExpressionParser) => [SqlFragment, SqlParameterMap];
|
7
|
+
//# sourceMappingURL=sql.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/sql/sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAe,MAAM,kCAAkC,CAAA;AAC1E,OAAO,EAA8B,mBAAmB,EAA8B,MAAM,iDAAiD,CAAA;AAC7I,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAExE,eAAO,MAAM,QAAQ,GAAI,UAAU,MAAM,KAAG,WAE3C,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,YAAY,UAAU,CAAC,OAAO,CAAC,EAC/B,aAAa,UAAU,CAAC,MAAM,CAAC,EAC/B,SAAQ,mBAAgD,KACvD,CAAC,WAAW,EAAE,eAAe,CAO/B,CAAA"}
|
package/dist/sql/sql.js
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
// src/sql/sql.ts
|
2
|
+
import { Expressions } from "@bessemer/cornerstone/expression";
|
3
|
+
import { DefaultSqlExpressionParser } from "@bessemer/cornerstone/sql/sql-expression-parser";
|
4
|
+
var fragment = (fragment2) => {
|
5
|
+
return fragment2;
|
6
|
+
};
|
7
|
+
var parseExpression = (expression, variableMap, parser = DefaultSqlExpressionParser) => {
|
8
|
+
const context = {
|
9
|
+
variables: variableMap,
|
10
|
+
parameters: {}
|
11
|
+
};
|
12
|
+
const fragment2 = Expressions.map(expression, parser, context);
|
13
|
+
return [fragment2, context.parameters];
|
14
|
+
};
|
15
|
+
export {
|
16
|
+
fragment,
|
17
|
+
parseExpression
|
18
|
+
};
|
19
|
+
//# sourceMappingURL=sql.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../src/sql/sql.ts"],"sourcesContent":["import { Expression, Expressions } from '@bessemer/cornerstone/expression'\nimport { DefaultSqlExpressionParser, SqlExpressionParser, SqlExpressionParserContext } from '@bessemer/cornerstone/sql/sql-expression-parser'\nimport { Dictionary } from '@bessemer/cornerstone/types'\nimport { SqlFragment, SqlParameterMap } from '@bessemer/cornerstone/sql'\n\nexport const fragment = (fragment: string): SqlFragment => {\n return fragment\n}\n\nexport const parseExpression = (\n expression: Expression<unknown>,\n variableMap: Dictionary<string>,\n parser: SqlExpressionParser = DefaultSqlExpressionParser\n): [SqlFragment, SqlParameterMap] => {\n const context: SqlExpressionParserContext = {\n variables: variableMap,\n parameters: {},\n }\n const fragment = Expressions.map(expression, parser, context)\n return [fragment, context.parameters]\n}\n"],"mappings":";AAAA,SAAqB,mBAAmB;AACxC,SAAS,kCAAmF;AAIrF,IAAM,WAAW,CAACA,cAAkC;AACzD,SAAOA;AACT;AAEO,IAAM,kBAAkB,CAC7B,YACA,aACA,SAA8B,+BACK;AACnC,QAAM,UAAsC;AAAA,IAC1C,WAAW;AAAA,IACX,YAAY,CAAC;AAAA,EACf;AACA,QAAMA,YAAW,YAAY,IAAI,YAAY,QAAQ,OAAO;AAC5D,SAAO,CAACA,WAAU,QAAQ,UAAU;AACtC;","names":["fragment"]}
|
package/dist/sql.d.ts
ADDED
@@ -0,0 +1,6 @@
|
|
1
|
+
import * as Sql from '@bessemer/cornerstone/sql/sql';
|
2
|
+
import { BasicType, Dictionary, NominalType } from '@bessemer/cornerstone/types';
|
3
|
+
export { Sql };
|
4
|
+
export type SqlFragment = NominalType<string, 'SqlFragment'>;
|
5
|
+
export type SqlParameterMap = Dictionary<BasicType | Array<BasicType>>;
|
6
|
+
//# sourceMappingURL=sql.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../src/sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,+BAA+B,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAEhF,OAAO,EAAE,GAAG,EAAE,CAAA;AAEd,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;AAC5D,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAA"}
|
package/dist/sql.js
ADDED
package/dist/sql.js.map
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../src/sql.ts"],"sourcesContent":["import * as Sql from '@bessemer/cornerstone/sql/sql'\nimport { BasicType, Dictionary, NominalType } from '@bessemer/cornerstone/types'\n\nexport { Sql }\n\nexport type SqlFragment = NominalType<string, 'SqlFragment'>\nexport type SqlParameterMap = Dictionary<BasicType | Array<BasicType>>\n"],"mappings":";AAAA,YAAY,SAAS;","names":[]}
|
package/package.json
CHANGED
@@ -1,35 +0,0 @@
|
|
1
|
-
import { Expression } from '@bessemer/cornerstone/expression';
|
2
|
-
import { BasicType } from '@bessemer/cornerstone/types';
|
3
|
-
export declare const LessThanExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<boolean, [left: Expression<BasicType>, right: Expression<BasicType>], Expression<boolean> & {
|
4
|
-
left: Expression<BasicType>;
|
5
|
-
right: Expression<BasicType>;
|
6
|
-
}>;
|
7
|
-
export declare const lessThan: (left: Expression<BasicType>, right: Expression<BasicType>) => Expression<boolean> & {
|
8
|
-
left: Expression<BasicType>;
|
9
|
-
right: Expression<BasicType>;
|
10
|
-
};
|
11
|
-
export declare const LessThanOrEqualExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<boolean, [left: Expression<BasicType>, right: Expression<BasicType>], Expression<boolean> & {
|
12
|
-
left: Expression<BasicType>;
|
13
|
-
right: Expression<BasicType>;
|
14
|
-
}>;
|
15
|
-
export declare const lessThanOrEqual: (left: Expression<BasicType>, right: Expression<BasicType>) => Expression<boolean> & {
|
16
|
-
left: Expression<BasicType>;
|
17
|
-
right: Expression<BasicType>;
|
18
|
-
};
|
19
|
-
export declare const GreaterThanExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<boolean, [left: Expression<BasicType>, right: Expression<BasicType>], Expression<boolean> & {
|
20
|
-
left: Expression<BasicType>;
|
21
|
-
right: Expression<BasicType>;
|
22
|
-
}>;
|
23
|
-
export declare const greaterThan: (left: Expression<BasicType>, right: Expression<BasicType>) => Expression<boolean> & {
|
24
|
-
left: Expression<BasicType>;
|
25
|
-
right: Expression<BasicType>;
|
26
|
-
};
|
27
|
-
export declare const GreaterThanOrEqualExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<boolean, [left: Expression<BasicType>, right: Expression<BasicType>], Expression<boolean> & {
|
28
|
-
left: Expression<BasicType>;
|
29
|
-
right: Expression<BasicType>;
|
30
|
-
}>;
|
31
|
-
export declare const greaterThanOrEqual: (left: Expression<BasicType>, right: Expression<BasicType>) => Expression<boolean> & {
|
32
|
-
left: Expression<BasicType>;
|
33
|
-
right: Expression<BasicType>;
|
34
|
-
};
|
35
|
-
//# sourceMappingURL=basic-expression.d.ts.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"basic-expression.d.ts","sourceRoot":"","sources":["../../src/expression/basic-expression.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAEvD,eAAO,MAAM,kBAAkB;;;EAQ7B,CAAA;AAEF,eAAO,MAAM,QAAQ;;;CAA6B,CAAA;AAElD,eAAO,MAAM,yBAAyB;;;EAQpC,CAAA;AAEF,eAAO,MAAM,eAAe;;;CAAoC,CAAA;AAEhE,eAAO,MAAM,qBAAqB;;;EAQhC,CAAA;AAEF,eAAO,MAAM,WAAW;;;CAAgC,CAAA;AAExD,eAAO,MAAM,4BAA4B;;;EAQvC,CAAA;AAEF,eAAO,MAAM,kBAAkB;;;CAAuC,CAAA"}
|
@@ -1,53 +0,0 @@
|
|
1
|
-
// src/expression/basic-expression.ts
|
2
|
-
import { defineExpression } from "@bessemer/cornerstone/expression/internal";
|
3
|
-
var LessThanExpression = defineExpression({
|
4
|
-
expressionKey: "Basic.LessThan",
|
5
|
-
builder: (left, right) => {
|
6
|
-
return { left, right };
|
7
|
-
},
|
8
|
-
resolver: ({ left, right }, evaluate) => {
|
9
|
-
return evaluate(left) < evaluate(right);
|
10
|
-
}
|
11
|
-
});
|
12
|
-
var lessThan = LessThanExpression.builder;
|
13
|
-
var LessThanOrEqualExpression = defineExpression({
|
14
|
-
expressionKey: "Basic.LessThanOrEqual",
|
15
|
-
builder: (left, right) => {
|
16
|
-
return { left, right };
|
17
|
-
},
|
18
|
-
resolver: ({ left, right }, evaluate) => {
|
19
|
-
return evaluate(left) <= evaluate(right);
|
20
|
-
}
|
21
|
-
});
|
22
|
-
var lessThanOrEqual = LessThanOrEqualExpression.builder;
|
23
|
-
var GreaterThanExpression = defineExpression({
|
24
|
-
expressionKey: "Basic.GreaterThan",
|
25
|
-
builder: (left, right) => {
|
26
|
-
return { left, right };
|
27
|
-
},
|
28
|
-
resolver: ({ left, right }, evaluate) => {
|
29
|
-
return evaluate(left) > evaluate(right);
|
30
|
-
}
|
31
|
-
});
|
32
|
-
var greaterThan = GreaterThanExpression.builder;
|
33
|
-
var GreaterThanOrEqualExpression = defineExpression({
|
34
|
-
expressionKey: "Basic.GreaterThanOrEqual",
|
35
|
-
builder: (left, right) => {
|
36
|
-
return { left, right };
|
37
|
-
},
|
38
|
-
resolver: ({ left, right }, evaluate) => {
|
39
|
-
return evaluate(left) >= evaluate(right);
|
40
|
-
}
|
41
|
-
});
|
42
|
-
var greaterThanOrEqual = GreaterThanOrEqualExpression.builder;
|
43
|
-
export {
|
44
|
-
GreaterThanExpression,
|
45
|
-
GreaterThanOrEqualExpression,
|
46
|
-
LessThanExpression,
|
47
|
-
LessThanOrEqualExpression,
|
48
|
-
greaterThan,
|
49
|
-
greaterThanOrEqual,
|
50
|
-
lessThan,
|
51
|
-
lessThanOrEqual
|
52
|
-
};
|
53
|
-
//# sourceMappingURL=basic-expression.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../../src/expression/basic-expression.ts"],"sourcesContent":["import { defineExpression } from '@bessemer/cornerstone/expression/internal'\nimport { Expression } from '@bessemer/cornerstone/expression'\nimport { BasicType } from '@bessemer/cornerstone/types'\n\nexport const LessThanExpression = defineExpression({\n expressionKey: 'Basic.LessThan',\n builder: (left: Expression<BasicType>, right: Expression<BasicType>) => {\n return { left, right }\n },\n resolver: ({ left, right }, evaluate) => {\n return evaluate(left) < evaluate(right)\n },\n})\n\nexport const lessThan = LessThanExpression.builder\n\nexport const LessThanOrEqualExpression = defineExpression({\n expressionKey: 'Basic.LessThanOrEqual',\n builder: (left: Expression<BasicType>, right: Expression<BasicType>) => {\n return { left, right }\n },\n resolver: ({ left, right }, evaluate) => {\n return evaluate(left) <= evaluate(right)\n },\n})\n\nexport const lessThanOrEqual = LessThanOrEqualExpression.builder\n\nexport const GreaterThanExpression = defineExpression({\n expressionKey: 'Basic.GreaterThan',\n builder: (left: Expression<BasicType>, right: Expression<BasicType>) => {\n return { left, right }\n },\n resolver: ({ left, right }, evaluate) => {\n return evaluate(left) > evaluate(right)\n },\n})\n\nexport const greaterThan = GreaterThanExpression.builder\n\nexport const GreaterThanOrEqualExpression = defineExpression({\n expressionKey: 'Basic.GreaterThanOrEqual',\n builder: (left: Expression<BasicType>, right: Expression<BasicType>) => {\n return { left, right }\n },\n resolver: ({ left, right }, evaluate) => {\n return evaluate(left) >= evaluate(right)\n },\n})\n\nexport const greaterThanOrEqual = GreaterThanOrEqualExpression.builder\n"],"mappings":";AAAA,SAAS,wBAAwB;AAI1B,IAAM,qBAAqB,iBAAiB;AAAA,EACjD,eAAe;AAAA,EACf,SAAS,CAAC,MAA6B,UAAiC;AACtE,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAAA,EACA,UAAU,CAAC,EAAE,MAAM,MAAM,GAAG,aAAa;AACvC,WAAO,SAAS,IAAI,IAAI,SAAS,KAAK;AAAA,EACxC;AACF,CAAC;AAEM,IAAM,WAAW,mBAAmB;AAEpC,IAAM,4BAA4B,iBAAiB;AAAA,EACxD,eAAe;AAAA,EACf,SAAS,CAAC,MAA6B,UAAiC;AACtE,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAAA,EACA,UAAU,CAAC,EAAE,MAAM,MAAM,GAAG,aAAa;AACvC,WAAO,SAAS,IAAI,KAAK,SAAS,KAAK;AAAA,EACzC;AACF,CAAC;AAEM,IAAM,kBAAkB,0BAA0B;AAElD,IAAM,wBAAwB,iBAAiB;AAAA,EACpD,eAAe;AAAA,EACf,SAAS,CAAC,MAA6B,UAAiC;AACtE,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAAA,EACA,UAAU,CAAC,EAAE,MAAM,MAAM,GAAG,aAAa;AACvC,WAAO,SAAS,IAAI,IAAI,SAAS,KAAK;AAAA,EACxC;AACF,CAAC;AAEM,IAAM,cAAc,sBAAsB;AAE1C,IAAM,+BAA+B,iBAAiB;AAAA,EAC3D,eAAe;AAAA,EACf,SAAS,CAAC,MAA6B,UAAiC;AACtE,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAAA,EACA,UAAU,CAAC,EAAE,MAAM,MAAM,GAAG,aAAa;AACvC,WAAO,SAAS,IAAI,KAAK,SAAS,KAAK;AAAA,EACzC;AACF,CAAC;AAEM,IAAM,qBAAqB,6BAA6B;","names":[]}
|
@@ -1,8 +0,0 @@
|
|
1
|
-
import { ExpressionMapper } from '@bessemer/cornerstone/expression/expression-mapper';
|
2
|
-
import { BasicType, Dictionary } from '@bessemer/cornerstone/types';
|
3
|
-
export type SqlExpressionParserContext = {
|
4
|
-
variables: Dictionary<string>;
|
5
|
-
parameters: Dictionary<BasicType>;
|
6
|
-
};
|
7
|
-
export declare const SqlExpressionParser: ExpressionMapper<string, SqlExpressionParserContext>;
|
8
|
-
//# sourceMappingURL=sql-expression-parser.d.ts.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"sql-expression-parser.d.ts","sourceRoot":"","sources":["../../src/expression/sql-expression-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oDAAoD,CAAA;AAErF,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAInE,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;IAC7B,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;CAClC,CAAA;AACD,eAAO,MAAM,mBAAmB,sDAAkE,CAAA"}
|
@@ -1,51 +0,0 @@
|
|
1
|
-
// src/expression/sql-expression-parser.ts
|
2
|
-
import { BasicExpressions, Expressions } from "@bessemer/cornerstone/expression";
|
3
|
-
import { ExpressionMapper } from "@bessemer/cornerstone/expression/expression-mapper";
|
4
|
-
import { Arrays, Objects, Preconditions, Ulids } from "@bessemer/cornerstone";
|
5
|
-
var SqlExpressionParser = new ExpressionMapper();
|
6
|
-
SqlExpressionParser.register(Expressions.ValueExpression, (expression, _, context) => {
|
7
|
-
const value = expression.value;
|
8
|
-
const parameterName = `_${Ulids.generate()}`;
|
9
|
-
if (!Objects.isBasic(value)) {
|
10
|
-
throw new Error(`Unable to resolve complex ValueExpression as Sql: ${JSON.stringify(value)}`);
|
11
|
-
}
|
12
|
-
context.parameters[parameterName] = value;
|
13
|
-
return `:${parameterName}`;
|
14
|
-
});
|
15
|
-
SqlExpressionParser.register(Expressions.VariableExpression, (expression, _, context) => {
|
16
|
-
const variableName = context.variables[expression.name];
|
17
|
-
Preconditions.isPresent(variableName, `Unable to resolve VariableExpression with name: ${expression.name}`);
|
18
|
-
return variableName;
|
19
|
-
});
|
20
|
-
SqlExpressionParser.register(Expressions.NotExpression, (expression, map) => {
|
21
|
-
return `(NOT ${map(expression.value)})`;
|
22
|
-
});
|
23
|
-
SqlExpressionParser.register(Expressions.AndExpression, (expression, map) => {
|
24
|
-
return `(${expression.operands.map(map).join(" AND ")})`;
|
25
|
-
});
|
26
|
-
SqlExpressionParser.register(Expressions.OrExpression, (expression, map) => {
|
27
|
-
return `(${expression.operands.map(map).join(" OR ")})`;
|
28
|
-
});
|
29
|
-
SqlExpressionParser.register(Expressions.EqualsExpression, (expression, map) => {
|
30
|
-
const first = Arrays.first(expression.operands);
|
31
|
-
const rest = Arrays.rest(expression.operands);
|
32
|
-
const mappedFirst = map(first);
|
33
|
-
const equalsExpressions = rest.map((it) => `(${mappedFirst} = ${map(it)})`).join(" AND ");
|
34
|
-
return `(${equalsExpressions})`;
|
35
|
-
});
|
36
|
-
SqlExpressionParser.register(BasicExpressions.LessThanExpression, (expression, map) => {
|
37
|
-
return `(${map(expression.left)} < ${map(expression.right)})`;
|
38
|
-
});
|
39
|
-
SqlExpressionParser.register(BasicExpressions.LessThanOrEqualExpression, (expression, map) => {
|
40
|
-
return `(${map(expression.left)} <= ${map(expression.right)})`;
|
41
|
-
});
|
42
|
-
SqlExpressionParser.register(BasicExpressions.GreaterThanExpression, (expression, map) => {
|
43
|
-
return `(${map(expression.left)} > ${map(expression.right)})`;
|
44
|
-
});
|
45
|
-
SqlExpressionParser.register(BasicExpressions.GreaterThanOrEqualExpression, (expression, map) => {
|
46
|
-
return `(${map(expression.left)} >= ${map(expression.right)})`;
|
47
|
-
});
|
48
|
-
export {
|
49
|
-
SqlExpressionParser
|
50
|
-
};
|
51
|
-
//# sourceMappingURL=sql-expression-parser.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../../src/expression/sql-expression-parser.ts"],"sourcesContent":["import { BasicExpressions, Expressions } from '@bessemer/cornerstone/expression'\nimport { ExpressionMapper } from '@bessemer/cornerstone/expression/expression-mapper'\nimport { Arrays, Objects, Preconditions, Ulids } from '@bessemer/cornerstone'\nimport { BasicType, Dictionary } from '@bessemer/cornerstone/types'\n\n// JOHN need to add tests...\ntype SqlFragment = string\nexport type SqlExpressionParserContext = {\n variables: Dictionary<string>\n parameters: Dictionary<BasicType>\n}\nexport const SqlExpressionParser = new ExpressionMapper<SqlFragment, SqlExpressionParserContext>()\n\nSqlExpressionParser.register(Expressions.ValueExpression, (expression, _, context) => {\n const value = expression.value\n const parameterName = `_${Ulids.generate()}`\n if (!Objects.isBasic(value)) {\n throw new Error(`Unable to resolve complex ValueExpression as Sql: ${JSON.stringify(value)}`)\n }\n\n context.parameters[parameterName] = value\n return `:${parameterName}`\n})\nSqlExpressionParser.register(Expressions.VariableExpression, (expression, _, context) => {\n const variableName = context.variables[expression.name]\n Preconditions.isPresent(variableName, `Unable to resolve VariableExpression with name: ${expression.name}`)\n return variableName\n})\nSqlExpressionParser.register(Expressions.NotExpression, (expression, map) => {\n return `(NOT ${map(expression.value)})`\n})\nSqlExpressionParser.register(Expressions.AndExpression, (expression, map) => {\n return `(${expression.operands.map(map).join(' AND ')})`\n})\nSqlExpressionParser.register(Expressions.OrExpression, (expression, map) => {\n return `(${expression.operands.map(map).join(' OR ')})`\n})\nSqlExpressionParser.register(Expressions.EqualsExpression, (expression, map) => {\n const first = Arrays.first(expression.operands)!\n const rest = Arrays.rest(expression.operands)\n\n const mappedFirst = map(first)\n const equalsExpressions = rest.map((it) => `(${mappedFirst} = ${map(it)})`).join(' AND ')\n return `(${equalsExpressions})`\n})\n// SqlExpressionMapper.register(Expressions.ContainsExpression, (expression, map, context) => {\n// // JOHN incomplete\n// expression.collection\n// return `(someVariable IN (${expression.collection}))`\n// })\nSqlExpressionParser.register(BasicExpressions.LessThanExpression, (expression, map) => {\n return `(${map(expression.left)} < ${map(expression.right)})`\n})\nSqlExpressionParser.register(BasicExpressions.LessThanOrEqualExpression, (expression, map) => {\n return `(${map(expression.left)} <= ${map(expression.right)})`\n})\nSqlExpressionParser.register(BasicExpressions.GreaterThanExpression, (expression, map) => {\n return `(${map(expression.left)} > ${map(expression.right)})`\n})\nSqlExpressionParser.register(BasicExpressions.GreaterThanOrEqualExpression, (expression, map) => {\n return `(${map(expression.left)} >= ${map(expression.right)})`\n})\n"],"mappings":";AAAA,SAAS,kBAAkB,mBAAmB;AAC9C,SAAS,wBAAwB;AACjC,SAAS,QAAQ,SAAS,eAAe,aAAa;AAS/C,IAAM,sBAAsB,IAAI,iBAA0D;AAEjG,oBAAoB,SAAS,YAAY,iBAAiB,CAAC,YAAY,GAAG,YAAY;AACpF,QAAM,QAAQ,WAAW;AACzB,QAAM,gBAAgB,IAAI,MAAM,SAAS,CAAC;AAC1C,MAAI,CAAC,QAAQ,QAAQ,KAAK,GAAG;AAC3B,UAAM,IAAI,MAAM,qDAAqD,KAAK,UAAU,KAAK,CAAC,EAAE;AAAA,EAC9F;AAEA,UAAQ,WAAW,aAAa,IAAI;AACpC,SAAO,IAAI,aAAa;AAC1B,CAAC;AACD,oBAAoB,SAAS,YAAY,oBAAoB,CAAC,YAAY,GAAG,YAAY;AACvF,QAAM,eAAe,QAAQ,UAAU,WAAW,IAAI;AACtD,gBAAc,UAAU,cAAc,mDAAmD,WAAW,IAAI,EAAE;AAC1G,SAAO;AACT,CAAC;AACD,oBAAoB,SAAS,YAAY,eAAe,CAAC,YAAY,QAAQ;AAC3E,SAAO,QAAQ,IAAI,WAAW,KAAK,CAAC;AACtC,CAAC;AACD,oBAAoB,SAAS,YAAY,eAAe,CAAC,YAAY,QAAQ;AAC3E,SAAO,IAAI,WAAW,SAAS,IAAI,GAAG,EAAE,KAAK,OAAO,CAAC;AACvD,CAAC;AACD,oBAAoB,SAAS,YAAY,cAAc,CAAC,YAAY,QAAQ;AAC1E,SAAO,IAAI,WAAW,SAAS,IAAI,GAAG,EAAE,KAAK,MAAM,CAAC;AACtD,CAAC;AACD,oBAAoB,SAAS,YAAY,kBAAkB,CAAC,YAAY,QAAQ;AAC9E,QAAM,QAAQ,OAAO,MAAM,WAAW,QAAQ;AAC9C,QAAM,OAAO,OAAO,KAAK,WAAW,QAAQ;AAE5C,QAAM,cAAc,IAAI,KAAK;AAC7B,QAAM,oBAAoB,KAAK,IAAI,CAAC,OAAO,IAAI,WAAW,MAAM,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,OAAO;AACxF,SAAO,IAAI,iBAAiB;AAC9B,CAAC;AAMD,oBAAoB,SAAS,iBAAiB,oBAAoB,CAAC,YAAY,QAAQ;AACrF,SAAO,IAAI,IAAI,WAAW,IAAI,CAAC,MAAM,IAAI,WAAW,KAAK,CAAC;AAC5D,CAAC;AACD,oBAAoB,SAAS,iBAAiB,2BAA2B,CAAC,YAAY,QAAQ;AAC5F,SAAO,IAAI,IAAI,WAAW,IAAI,CAAC,OAAO,IAAI,WAAW,KAAK,CAAC;AAC7D,CAAC;AACD,oBAAoB,SAAS,iBAAiB,uBAAuB,CAAC,YAAY,QAAQ;AACxF,SAAO,IAAI,IAAI,WAAW,IAAI,CAAC,MAAM,IAAI,WAAW,KAAK,CAAC;AAC5D,CAAC;AACD,oBAAoB,SAAS,iBAAiB,8BAA8B,CAAC,YAAY,QAAQ;AAC/F,SAAO,IAAI,IAAI,WAAW,IAAI,CAAC,OAAO,IAAI,WAAW,KAAK,CAAC;AAC7D,CAAC;","names":[]}
|