flowquery 1.0.0 → 1.0.2
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/.github/workflows/npm-publish.yml +2 -0
- package/.github/workflows/release.yml +24 -9
- package/dist/compute/runner.js +75 -0
- package/dist/compute/runner.js.map +1 -0
- package/dist/flowquery.min.js +1 -0
- package/dist/index.browser.js +119 -0
- package/dist/index.browser.js.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/index.node.js +123 -0
- package/dist/index.node.js.map +1 -0
- package/dist/io/command_line.js +102 -0
- package/dist/io/command_line.js.map +1 -0
- package/dist/parsing/alias.js +23 -0
- package/dist/parsing/alias.js.map +1 -0
- package/dist/parsing/alias_option.js +11 -0
- package/dist/parsing/alias_option.js.map +1 -0
- package/dist/parsing/ast_node.js +145 -0
- package/dist/parsing/ast_node.js.map +1 -0
- package/dist/parsing/base_parser.js +92 -0
- package/dist/parsing/base_parser.js.map +1 -0
- package/dist/parsing/components/csv.js +13 -0
- package/dist/parsing/components/csv.js.map +1 -0
- package/dist/parsing/components/from.js +16 -0
- package/dist/parsing/components/from.js.map +1 -0
- package/dist/parsing/components/headers.js +16 -0
- package/dist/parsing/components/headers.js.map +1 -0
- package/dist/parsing/components/json.js +13 -0
- package/dist/parsing/components/json.js.map +1 -0
- package/dist/parsing/components/null.js +13 -0
- package/dist/parsing/components/null.js.map +1 -0
- package/dist/parsing/components/post.js +13 -0
- package/dist/parsing/components/post.js.map +1 -0
- package/dist/parsing/components/text.js +13 -0
- package/dist/parsing/components/text.js.map +1 -0
- package/dist/parsing/context.js +47 -0
- package/dist/parsing/context.js.map +1 -0
- package/dist/parsing/data_structures/associative_array.js +45 -0
- package/dist/parsing/data_structures/associative_array.js.map +1 -0
- package/dist/parsing/data_structures/json_array.js +35 -0
- package/dist/parsing/data_structures/json_array.js.map +1 -0
- package/dist/parsing/data_structures/key_value_pair.js +41 -0
- package/dist/parsing/data_structures/key_value_pair.js.map +1 -0
- package/dist/parsing/data_structures/lookup.js +44 -0
- package/dist/parsing/data_structures/lookup.js.map +1 -0
- package/dist/parsing/data_structures/range_lookup.js +40 -0
- package/dist/parsing/data_structures/range_lookup.js.map +1 -0
- package/dist/parsing/expressions/expression.js +142 -0
- package/dist/parsing/expressions/expression.js.map +1 -0
- package/dist/parsing/expressions/f_string.js +29 -0
- package/dist/parsing/expressions/f_string.js.map +1 -0
- package/dist/parsing/expressions/identifier.js +26 -0
- package/dist/parsing/expressions/identifier.js.map +1 -0
- package/dist/parsing/expressions/number.js +41 -0
- package/dist/parsing/expressions/number.js.map +1 -0
- package/dist/parsing/expressions/operator.js +180 -0
- package/dist/parsing/expressions/operator.js.map +1 -0
- package/dist/parsing/expressions/reference.js +45 -0
- package/dist/parsing/expressions/reference.js.map +1 -0
- package/dist/parsing/expressions/string.js +34 -0
- package/dist/parsing/expressions/string.js.map +1 -0
- package/dist/parsing/functions/aggregate_function.js +58 -0
- package/dist/parsing/functions/aggregate_function.js.map +1 -0
- package/dist/parsing/functions/async_function.js +119 -0
- package/dist/parsing/functions/async_function.js.map +1 -0
- package/dist/parsing/functions/avg.js +43 -0
- package/dist/parsing/functions/avg.js.map +1 -0
- package/dist/parsing/functions/collect.js +52 -0
- package/dist/parsing/functions/collect.js.map +1 -0
- package/dist/parsing/functions/function.js +59 -0
- package/dist/parsing/functions/function.js.map +1 -0
- package/dist/parsing/functions/function_factory.js +259 -0
- package/dist/parsing/functions/function_factory.js.map +1 -0
- package/dist/parsing/functions/function_metadata.js +159 -0
- package/dist/parsing/functions/function_metadata.js.map +1 -0
- package/dist/parsing/functions/functions.js +47 -0
- package/dist/parsing/functions/functions.js.map +1 -0
- package/dist/parsing/functions/join.js +29 -0
- package/dist/parsing/functions/join.js.map +1 -0
- package/dist/parsing/functions/predicate_function.js +37 -0
- package/dist/parsing/functions/predicate_function.js.map +1 -0
- package/dist/parsing/functions/predicate_function_factory.js +19 -0
- package/dist/parsing/functions/predicate_function_factory.js.map +1 -0
- package/dist/parsing/functions/predicate_sum.js +33 -0
- package/dist/parsing/functions/predicate_sum.js.map +1 -0
- package/dist/parsing/functions/rand.js +17 -0
- package/dist/parsing/functions/rand.js.map +1 -0
- package/dist/parsing/functions/range.js +22 -0
- package/dist/parsing/functions/range.js.map +1 -0
- package/dist/parsing/functions/reducer_element.js +12 -0
- package/dist/parsing/functions/reducer_element.js.map +1 -0
- package/dist/parsing/functions/replace.js +23 -0
- package/dist/parsing/functions/replace.js.map +1 -0
- package/dist/parsing/functions/round.js +21 -0
- package/dist/parsing/functions/round.js.map +1 -0
- package/dist/parsing/functions/size.js +21 -0
- package/dist/parsing/functions/size.js.map +1 -0
- package/dist/parsing/functions/split.js +29 -0
- package/dist/parsing/functions/split.js.map +1 -0
- package/dist/parsing/functions/stringify.js +29 -0
- package/dist/parsing/functions/stringify.js.map +1 -0
- package/dist/parsing/functions/sum.js +38 -0
- package/dist/parsing/functions/sum.js.map +1 -0
- package/dist/parsing/functions/to_json.js +21 -0
- package/dist/parsing/functions/to_json.js.map +1 -0
- package/dist/parsing/functions/value_holder.js +16 -0
- package/dist/parsing/functions/value_holder.js.map +1 -0
- package/dist/parsing/logic/case.js +27 -0
- package/dist/parsing/logic/case.js.map +1 -0
- package/dist/parsing/logic/else.js +16 -0
- package/dist/parsing/logic/else.js.map +1 -0
- package/dist/parsing/logic/end.js +13 -0
- package/dist/parsing/logic/end.js.map +1 -0
- package/dist/parsing/logic/then.js +16 -0
- package/dist/parsing/logic/then.js.map +1 -0
- package/dist/parsing/logic/when.js +16 -0
- package/dist/parsing/logic/when.js.map +1 -0
- package/dist/parsing/operations/aggregated_return.js +35 -0
- package/dist/parsing/operations/aggregated_return.js.map +1 -0
- package/dist/parsing/operations/aggregated_with.js +41 -0
- package/dist/parsing/operations/aggregated_with.js.map +1 -0
- package/dist/parsing/operations/group_by.js +139 -0
- package/dist/parsing/operations/group_by.js.map +1 -0
- package/dist/parsing/operations/limit.js +38 -0
- package/dist/parsing/operations/limit.js.map +1 -0
- package/dist/parsing/operations/load.js +174 -0
- package/dist/parsing/operations/load.js.map +1 -0
- package/dist/parsing/operations/operation.js +81 -0
- package/dist/parsing/operations/operation.js.map +1 -0
- package/dist/parsing/operations/projection.js +21 -0
- package/dist/parsing/operations/projection.js.map +1 -0
- package/dist/parsing/operations/return.js +60 -0
- package/dist/parsing/operations/return.js.map +1 -0
- package/dist/parsing/operations/unwind.js +46 -0
- package/dist/parsing/operations/unwind.js.map +1 -0
- package/dist/parsing/operations/where.js +53 -0
- package/dist/parsing/operations/where.js.map +1 -0
- package/dist/parsing/operations/with.js +36 -0
- package/dist/parsing/operations/with.js.map +1 -0
- package/dist/parsing/parser.js +812 -0
- package/dist/parsing/parser.js.map +1 -0
- package/dist/parsing/token_to_node.js +121 -0
- package/dist/parsing/token_to_node.js.map +1 -0
- package/dist/tokenization/keyword.js +46 -0
- package/dist/tokenization/keyword.js.map +1 -0
- package/dist/tokenization/operator.js +28 -0
- package/dist/tokenization/operator.js.map +1 -0
- package/dist/tokenization/string_walker.js +165 -0
- package/dist/tokenization/string_walker.js.map +1 -0
- package/dist/tokenization/symbol.js +18 -0
- package/dist/tokenization/symbol.js.map +1 -0
- package/dist/tokenization/token.js +484 -0
- package/dist/tokenization/token.js.map +1 -0
- package/dist/tokenization/token_mapper.js +55 -0
- package/dist/tokenization/token_mapper.js.map +1 -0
- package/dist/tokenization/token_type.js +19 -0
- package/dist/tokenization/token_type.js.map +1 -0
- package/dist/tokenization/tokenizer.js +220 -0
- package/dist/tokenization/tokenizer.js.map +1 -0
- package/dist/tokenization/trie.js +111 -0
- package/dist/tokenization/trie.js.map +1 -0
- package/dist/utils/object_utils.js +19 -0
- package/dist/utils/object_utils.js.map +1 -0
- package/dist/utils/string_utils.js +110 -0
- package/dist/utils/string_utils.js.map +1 -0
- package/docs/flowquery.min.js +1 -1
- package/flowquery-vscode/flowQueryEngine/flowquery.min.js +1 -1
- package/package.json +22 -4
- package/src/compute/runner.ts +45 -0
- package/src/index.browser.ts +118 -0
- package/src/index.node.ts +141 -0
- package/src/parsing/functions/async_function.ts +95 -0
- package/src/parsing/functions/function_factory.ts +230 -1
- package/src/parsing/functions/function_metadata.ts +238 -0
- package/src/parsing/functions/functions.ts +43 -0
- package/src/parsing/operations/load.ts +51 -2
- package/src/parsing/parser.ts +45 -4
- package/tests/parsing/function_plugins.test.ts +369 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const ast_node_1 = __importDefault(require("../ast_node"));
|
|
7
|
+
/**
|
|
8
|
+
* Represents a string literal in the AST.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const str = new String("hello");
|
|
13
|
+
* console.log(str.value()); // "hello"
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
class String extends ast_node_1.default {
|
|
17
|
+
/**
|
|
18
|
+
* Creates a new String node with the given value.
|
|
19
|
+
*
|
|
20
|
+
* @param value - The string value
|
|
21
|
+
*/
|
|
22
|
+
constructor(value) {
|
|
23
|
+
super();
|
|
24
|
+
this._value = value;
|
|
25
|
+
}
|
|
26
|
+
value() {
|
|
27
|
+
return this._value;
|
|
28
|
+
}
|
|
29
|
+
toString() {
|
|
30
|
+
return `String (${this._value})`;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.default = String;
|
|
34
|
+
//# sourceMappingURL=string.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.js","sourceRoot":"","sources":["../../../src/parsing/expressions/string.ts"],"names":[],"mappings":";;;;;AAAA,2DAAkC;AAElC;;;;;;;;GAQG;AACH,MAAM,MAAO,SAAQ,kBAAO;IAGxB;;;;OAIG;IACH,YAAY,KAAa;QACrB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;IAEM,KAAK;QACR,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAEM,QAAQ;QACX,OAAO,WAAW,IAAI,CAAC,MAAM,GAAG,CAAC;IACrC,CAAC;CACJ;AAED,kBAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const function_1 = __importDefault(require("./function"));
|
|
7
|
+
/**
|
|
8
|
+
* Base class for aggregate functions that reduce multiple values to a single value.
|
|
9
|
+
*
|
|
10
|
+
* Aggregate functions like SUM, AVG, and COLLECT process multiple input values
|
|
11
|
+
* and produce a single output. They cannot be nested within other aggregate functions.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const sumFunc = new Sum();
|
|
16
|
+
* // Used in: RETURN SUM(values)
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
class AggregateFunction extends function_1.default {
|
|
20
|
+
/**
|
|
21
|
+
* Creates a new AggregateFunction with the given name.
|
|
22
|
+
*
|
|
23
|
+
* @param name - The function name
|
|
24
|
+
*/
|
|
25
|
+
constructor(name) {
|
|
26
|
+
super(name);
|
|
27
|
+
this._overridden = null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Processes a value during the aggregation phase.
|
|
31
|
+
*
|
|
32
|
+
* @param value - The element to aggregate
|
|
33
|
+
* @throws {Error} If not implemented by subclass
|
|
34
|
+
*/
|
|
35
|
+
reduce(value) {
|
|
36
|
+
throw new Error("Method not implemented.");
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Creates a reducer element for this aggregate function.
|
|
40
|
+
*
|
|
41
|
+
* @returns A ReducerElement instance
|
|
42
|
+
* @throws {Error} If not implemented by subclass
|
|
43
|
+
*/
|
|
44
|
+
element() {
|
|
45
|
+
throw new Error("Method not implemented.");
|
|
46
|
+
}
|
|
47
|
+
get overridden() {
|
|
48
|
+
return this._overridden;
|
|
49
|
+
}
|
|
50
|
+
set overridden(value) {
|
|
51
|
+
this._overridden = value;
|
|
52
|
+
}
|
|
53
|
+
value() {
|
|
54
|
+
return this._overridden;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.default = AggregateFunction;
|
|
58
|
+
//# sourceMappingURL=aggregate_function.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate_function.js","sourceRoot":"","sources":["../../../src/parsing/functions/aggregate_function.ts"],"names":[],"mappings":";;;;;AAAA,0DAAkC;AAGlC;;;;;;;;;;;GAWG;AACH,MAAM,iBAAkB,SAAQ,kBAAQ;IAGpC;;;;OAIG;IACH,YAAY,IAAY;QACpB,KAAK,CAAC,IAAI,CAAC,CAAC;QARR,gBAAW,GAAe,IAAI,CAAC;IASvC,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,KAAqB;QAC/B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;OAKG;IACI,OAAO;QACV,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IACD,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IACD,IAAW,UAAU,CAAC,KAAiB;QACnC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC7B,CAAC;IACM,KAAK;QACR,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;CACJ;AAED,kBAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
3
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
4
|
+
var m = o[Symbol.asyncIterator], i;
|
|
5
|
+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
6
|
+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
7
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
8
|
+
};
|
|
9
|
+
var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
|
|
10
|
+
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
|
|
11
|
+
var i, p;
|
|
12
|
+
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
|
|
13
|
+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
|
|
14
|
+
};
|
|
15
|
+
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
|
|
16
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
17
|
+
var g = generator.apply(thisArg, _arguments || []), i, q = [];
|
|
18
|
+
return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
|
|
19
|
+
function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
|
|
20
|
+
function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
|
|
21
|
+
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
|
|
22
|
+
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
|
|
23
|
+
function fulfill(value) { resume("next", value); }
|
|
24
|
+
function reject(value) { resume("throw", value); }
|
|
25
|
+
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
|
|
26
|
+
};
|
|
27
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
28
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
29
|
+
};
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
const ast_node_1 = __importDefault(require("../ast_node"));
|
|
32
|
+
const function_factory_1 = __importDefault(require("./function_factory"));
|
|
33
|
+
/**
|
|
34
|
+
* Represents an async data provider function call for use in LOAD operations.
|
|
35
|
+
*
|
|
36
|
+
* This class holds the function name and arguments, and provides async iteration
|
|
37
|
+
* over the results from a registered async data provider.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* // Used in: LOAD JSON FROM myDataSource('arg1', 'arg2') AS data
|
|
42
|
+
* const asyncFunc = new AsyncFunction("myDataSource");
|
|
43
|
+
* asyncFunc.parameters = [arg1Node, arg2Node];
|
|
44
|
+
* for await (const item of asyncFunc.execute()) {
|
|
45
|
+
* console.log(item);
|
|
46
|
+
* }
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
class AsyncFunction extends ast_node_1.default {
|
|
50
|
+
/**
|
|
51
|
+
* Creates a new AsyncFunction with the given name.
|
|
52
|
+
*
|
|
53
|
+
* @param name - The function name (must be registered as an async provider)
|
|
54
|
+
*/
|
|
55
|
+
constructor(name) {
|
|
56
|
+
super();
|
|
57
|
+
this._name = name;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Gets the function name.
|
|
61
|
+
*/
|
|
62
|
+
get name() {
|
|
63
|
+
return this._name;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Sets the function parameters.
|
|
67
|
+
*
|
|
68
|
+
* @param nodes - Array of AST nodes representing the function arguments
|
|
69
|
+
*/
|
|
70
|
+
set parameters(nodes) {
|
|
71
|
+
this.children = nodes;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Evaluates all parameters and returns their values.
|
|
75
|
+
*
|
|
76
|
+
* @returns Array of parameter values
|
|
77
|
+
*/
|
|
78
|
+
getArguments() {
|
|
79
|
+
return this.children.map(child => child.value());
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Executes the async data provider function and yields results.
|
|
83
|
+
*
|
|
84
|
+
* @yields Data items from the async provider
|
|
85
|
+
* @throws {Error} If the function is not registered as an async provider
|
|
86
|
+
*/
|
|
87
|
+
execute() {
|
|
88
|
+
return __asyncGenerator(this, arguments, function* execute_1() {
|
|
89
|
+
const provider = function_factory_1.default.getAsyncProvider(this._name);
|
|
90
|
+
if (!provider) {
|
|
91
|
+
throw new Error(`Async data provider '${this._name}' is not registered`);
|
|
92
|
+
}
|
|
93
|
+
const args = this.getArguments();
|
|
94
|
+
const result = provider(...args);
|
|
95
|
+
// Check if result is an async generator or a promise
|
|
96
|
+
if (result && typeof result.next === 'function') {
|
|
97
|
+
// It's an async generator
|
|
98
|
+
yield __await(yield* __asyncDelegator(__asyncValues(result)));
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// It's a promise - await and yield the result
|
|
102
|
+
const data = yield __await(result);
|
|
103
|
+
if (Array.isArray(data)) {
|
|
104
|
+
for (const item of data) {
|
|
105
|
+
yield yield __await(item);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
yield yield __await(data);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
toString() {
|
|
115
|
+
return `AsyncFunction (${this._name})`;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.default = AsyncFunction;
|
|
119
|
+
//# sourceMappingURL=async_function.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async_function.js","sourceRoot":"","sources":["../../../src/parsing/functions/async_function.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2DAAkC;AAClC,0EAAiD;AAEjD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,aAAc,SAAQ,kBAAO;IAG/B;;;;OAIG;IACH,YAAY,IAAY;QACpB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,IAAW,UAAU,CAAC,KAAgB;QAClC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACK,YAAY;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IACrD,CAAC;IAED;;;;;OAKG;IACW,OAAO;;YACjB,MAAM,QAAQ,GAAG,0BAAe,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,CAAC,KAAK,qBAAqB,CAAC,CAAC;YAC7E,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;YAEjC,qDAAqD;YACrD,IAAI,MAAM,IAAI,OAAQ,MAAyB,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAClE,0BAA0B;gBAC1B,cAAA,KAAK,CAAC,CAAC,iBAAA,cAAA,MAA4C,CAAA,CAAA,CAAA,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACJ,8CAA8C;gBAC9C,MAAM,IAAI,GAAG,cAAM,MAAM,CAAA,CAAC;gBAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBACtB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;wBACtB,oBAAM,IAAI,CAAA,CAAC;oBACf,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,oBAAM,IAAI,CAAA,CAAC;gBACf,CAAC;YACL,CAAC;QACL,CAAC;KAAA;IAEM,QAAQ;QACX,OAAO,kBAAkB,IAAI,CAAC,KAAK,GAAG,CAAC;IAC3C,CAAC;CACJ;AAED,kBAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const aggregate_function_1 = __importDefault(require("./aggregate_function"));
|
|
7
|
+
const reducer_element_1 = __importDefault(require("./reducer_element"));
|
|
8
|
+
class AvgReducerElement extends reducer_element_1.default {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(...arguments);
|
|
11
|
+
this._count = 0;
|
|
12
|
+
this._sum = null;
|
|
13
|
+
}
|
|
14
|
+
get value() {
|
|
15
|
+
if (this._sum === null) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
return this._sum / this._count;
|
|
19
|
+
}
|
|
20
|
+
set value(value) {
|
|
21
|
+
this._count += 1;
|
|
22
|
+
if (this._sum !== null) {
|
|
23
|
+
this._sum += value;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
this._sum = value;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
class Avg extends aggregate_function_1.default {
|
|
31
|
+
constructor() {
|
|
32
|
+
super("avg");
|
|
33
|
+
this._expectedParameterCount = 1;
|
|
34
|
+
}
|
|
35
|
+
reduce(element) {
|
|
36
|
+
element.value = this.firstChild().value();
|
|
37
|
+
}
|
|
38
|
+
element() {
|
|
39
|
+
return new AvgReducerElement();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.default = Avg;
|
|
43
|
+
//# sourceMappingURL=avg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avg.js","sourceRoot":"","sources":["../../../src/parsing/functions/avg.ts"],"names":[],"mappings":";;;;;AAAA,8EAAqD;AAErD,wEAA+C;AAE/C,MAAM,iBAAkB,SAAQ,yBAAc;IAA9C;;QACY,WAAM,GAAW,CAAC,CAAC;QACnB,SAAI,GAAkB,IAAI,CAAC;IAevC,CAAC;IAdG,IAAW,KAAK;QACZ,IAAG,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;IACnC,CAAC;IACD,IAAW,KAAK,CAAC,KAAa;QAC1B,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACjB,IAAG,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;QACvB,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QACtB,CAAC;IACL,CAAC;CACJ;AAED,MAAM,GAAI,SAAQ,4BAAiB;IAC/B;QACI,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,uBAAuB,GAAG,CAAC,CAAC;IACrC,CAAC;IACM,MAAM,CAAC,OAA0B;QACpC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,CAAC;IAC9C,CAAC;IACM,OAAO;QACV,OAAO,IAAI,iBAAiB,EAAE,CAAC;IACnC,CAAC;CACJ;AAED,kBAAe,GAAG,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const aggregate_function_1 = __importDefault(require("./aggregate_function"));
|
|
7
|
+
const reducer_element_1 = __importDefault(require("./reducer_element"));
|
|
8
|
+
class CollectReducerElement extends reducer_element_1.default {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(...arguments);
|
|
11
|
+
this._value = [];
|
|
12
|
+
}
|
|
13
|
+
get value() {
|
|
14
|
+
return this._value;
|
|
15
|
+
}
|
|
16
|
+
set value(value) {
|
|
17
|
+
this._value.push(value);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
class DistinctCollectReducerElement extends reducer_element_1.default {
|
|
21
|
+
constructor() {
|
|
22
|
+
super(...arguments);
|
|
23
|
+
this._value = new Map();
|
|
24
|
+
}
|
|
25
|
+
get value() {
|
|
26
|
+
return Array.from(this._value.values());
|
|
27
|
+
}
|
|
28
|
+
set value(value) {
|
|
29
|
+
const key = JSON.stringify(value);
|
|
30
|
+
if (!this._value.has(key)) {
|
|
31
|
+
this._value.set(key, value);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
class Collect extends aggregate_function_1.default {
|
|
36
|
+
constructor() {
|
|
37
|
+
super("collect");
|
|
38
|
+
this._distinct = false;
|
|
39
|
+
this._expectedParameterCount = 1;
|
|
40
|
+
}
|
|
41
|
+
reduce(element) {
|
|
42
|
+
element.value = this.firstChild().value();
|
|
43
|
+
}
|
|
44
|
+
element() {
|
|
45
|
+
return this._distinct ? new DistinctCollectReducerElement() : new CollectReducerElement();
|
|
46
|
+
}
|
|
47
|
+
set distinct(distinct) {
|
|
48
|
+
this._distinct = distinct;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.default = Collect;
|
|
52
|
+
//# sourceMappingURL=collect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect.js","sourceRoot":"","sources":["../../../src/parsing/functions/collect.ts"],"names":[],"mappings":";;;;;AAAA,8EAAqD;AACrD,wEAA+C;AAE/C,MAAM,qBAAsB,SAAQ,yBAAc;IAAlD;;QACY,WAAM,GAAU,EAAE,CAAC;IAO/B,CAAC;IANG,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IACD,IAAW,KAAK,CAAC,KAAU;QACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;CACJ;AAED,MAAM,6BAA8B,SAAQ,yBAAc;IAA1D;;QACY,WAAM,GAAkB,IAAI,GAAG,EAAE,CAAC;IAU9C,CAAC;IATG,IAAW,KAAK;QACZ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,IAAW,KAAK,CAAC,KAAU;QACvB,MAAM,GAAG,GAAW,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;IACL,CAAC;CACJ;AAED,MAAM,OAAQ,SAAQ,4BAAiB;IAEnC;QACI,KAAK,CAAC,SAAS,CAAC,CAAC;QAFb,cAAS,GAAY,KAAK,CAAC;QAG/B,IAAI,CAAC,uBAAuB,GAAG,CAAC,CAAC;IACrC,CAAC;IACM,MAAM,CAAC,OAA8B;QACxC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,CAAC;IAC9C,CAAC;IACM,OAAO;QACV,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,6BAA6B,EAAE,CAAC,CAAC,CAAC,IAAI,qBAAqB,EAAE,CAAC;IAC9F,CAAC;IACD,IAAW,QAAQ,CAAC,QAAiB;QACjC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC9B,CAAC;CACJ;AAED,kBAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const ast_node_1 = __importDefault(require("../ast_node"));
|
|
7
|
+
/**
|
|
8
|
+
* Base class for all functions in FlowQuery.
|
|
9
|
+
*
|
|
10
|
+
* Functions can have parameters and may support the DISTINCT modifier.
|
|
11
|
+
* Subclasses implement specific function logic.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const func = FunctionFactory.create("sum");
|
|
16
|
+
* func.parameters = [expression1, expression2];
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
class Function extends ast_node_1.default {
|
|
20
|
+
/**
|
|
21
|
+
* Creates a new Function with the given name.
|
|
22
|
+
*
|
|
23
|
+
* @param name - The function name
|
|
24
|
+
*/
|
|
25
|
+
constructor(name) {
|
|
26
|
+
super();
|
|
27
|
+
this._expectedParameterCount = null;
|
|
28
|
+
this._supports_distinct = false;
|
|
29
|
+
this._name = name;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Sets the function parameters.
|
|
33
|
+
*
|
|
34
|
+
* @param nodes - Array of AST nodes representing the function arguments
|
|
35
|
+
* @throws {Error} If the number of parameters doesn't match expected count
|
|
36
|
+
*/
|
|
37
|
+
set parameters(nodes) {
|
|
38
|
+
if (this._expectedParameterCount !== null && this._expectedParameterCount !== nodes.length) {
|
|
39
|
+
throw new Error(`Function ${this._name} expected ${this._expectedParameterCount} parameters, but got ${nodes.length}`);
|
|
40
|
+
}
|
|
41
|
+
this.children = nodes;
|
|
42
|
+
}
|
|
43
|
+
get name() {
|
|
44
|
+
return this._name;
|
|
45
|
+
}
|
|
46
|
+
toString() {
|
|
47
|
+
return `Function (${this._name})`;
|
|
48
|
+
}
|
|
49
|
+
set distinct(distinct) {
|
|
50
|
+
if (this._supports_distinct) {
|
|
51
|
+
this._supports_distinct = distinct;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
throw new Error(`Function ${this._name} does not support distinct`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.default = Function;
|
|
59
|
+
//# sourceMappingURL=function.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function.js","sourceRoot":"","sources":["../../../src/parsing/functions/function.ts"],"names":[],"mappings":";;;;;AAAA,2DAAkC;AAElC;;;;;;;;;;;GAWG;AACH,MAAM,QAAS,SAAQ,kBAAO;IAK1B;;;;OAIG;IACH,YAAY,IAAY;QACpB,KAAK,EAAE,CAAC;QATF,4BAAuB,GAAkB,IAAI,CAAC;QAC9C,uBAAkB,GAAY,KAAK,CAAC;QAS1C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACtB,CAAC;IAED;;;;;OAKG;IACH,IAAW,UAAU,CAAC,KAAgB;QAClC,IAAI,IAAI,CAAC,uBAAuB,KAAK,IAAI,IAAI,IAAI,CAAC,uBAAuB,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;YACzF,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,uBAAuB,wBAAwB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3H,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAEM,QAAQ;QACX,OAAO,aAAa,IAAI,CAAC,KAAK,GAAG,CAAC;IACtC,CAAC;IAED,IAAW,QAAQ,CAAC,QAAiB;QACjC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;QACvC,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,CAAC,KAAK,4BAA4B,CAAC,CAAC;QACxE,CAAC;IACL,CAAC;CACJ;AAED,kBAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const sum_1 = __importDefault(require("./sum"));
|
|
7
|
+
const collect_1 = __importDefault(require("./collect"));
|
|
8
|
+
const avg_1 = __importDefault(require("./avg"));
|
|
9
|
+
const range_1 = __importDefault(require("./range"));
|
|
10
|
+
const rand_1 = __importDefault(require("./rand"));
|
|
11
|
+
const round_1 = __importDefault(require("./round"));
|
|
12
|
+
const split_1 = __importDefault(require("./split"));
|
|
13
|
+
const join_1 = __importDefault(require("./join"));
|
|
14
|
+
const to_json_1 = __importDefault(require("./to_json"));
|
|
15
|
+
const replace_1 = __importDefault(require("./replace"));
|
|
16
|
+
const stringify_1 = __importDefault(require("./stringify"));
|
|
17
|
+
const size_1 = __importDefault(require("./size"));
|
|
18
|
+
const functions_1 = __importDefault(require("./functions"));
|
|
19
|
+
const function_1 = __importDefault(require("./function"));
|
|
20
|
+
const function_metadata_1 = require("./function_metadata");
|
|
21
|
+
/**
|
|
22
|
+
* Factory for creating function instances by name.
|
|
23
|
+
*
|
|
24
|
+
* Maps function names (case-insensitive) to their corresponding implementation classes.
|
|
25
|
+
* Supports built-in functions like sum, avg, collect, range, split, join, etc.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const sumFunc = FunctionFactory.create("sum");
|
|
30
|
+
* const avgFunc = FunctionFactory.create("AVG");
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
class FunctionFactory {
|
|
34
|
+
/**
|
|
35
|
+
* Registers a synchronous plugin function.
|
|
36
|
+
*
|
|
37
|
+
* @param name - The function name (will be lowercased)
|
|
38
|
+
* @param factoryOrOptions - Factory function or options object with metadata
|
|
39
|
+
*/
|
|
40
|
+
static register(name, factoryOrOptions) {
|
|
41
|
+
const lowerName = name.toLowerCase();
|
|
42
|
+
if (typeof factoryOrOptions === 'function') {
|
|
43
|
+
FunctionFactory.plugins.set(lowerName, factoryOrOptions);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
FunctionFactory.plugins.set(lowerName, factoryOrOptions.factory);
|
|
47
|
+
FunctionFactory.metadata.set(lowerName, Object.assign(Object.assign({}, factoryOrOptions.metadata), { name: lowerName, isAsyncProvider: false }));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Unregisters a synchronous plugin function.
|
|
52
|
+
*
|
|
53
|
+
* @param name - The function name to unregister
|
|
54
|
+
*/
|
|
55
|
+
static unregister(name) {
|
|
56
|
+
const lowerName = name.toLowerCase();
|
|
57
|
+
FunctionFactory.plugins.delete(lowerName);
|
|
58
|
+
FunctionFactory.metadata.delete(lowerName);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Registers an async data provider function for use in LOAD operations.
|
|
62
|
+
*
|
|
63
|
+
* @param name - The function name (will be lowercased)
|
|
64
|
+
* @param providerOrOptions - Async provider or options object with metadata
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* // Register with metadata for LLM consumption
|
|
69
|
+
* FunctionFactory.registerAsyncProvider("fetchUsers", {
|
|
70
|
+
* provider: async function* (endpoint: string) {
|
|
71
|
+
* const response = await fetch(endpoint);
|
|
72
|
+
* const data = await response.json();
|
|
73
|
+
* for (const item of data) {
|
|
74
|
+
* yield item;
|
|
75
|
+
* }
|
|
76
|
+
* },
|
|
77
|
+
* metadata: {
|
|
78
|
+
* name: "fetchUsers",
|
|
79
|
+
* description: "Fetches user data from an API endpoint",
|
|
80
|
+
* parameters: [
|
|
81
|
+
* { name: "endpoint", description: "API endpoint URL", type: "string" }
|
|
82
|
+
* ],
|
|
83
|
+
* output: {
|
|
84
|
+
* description: "User objects",
|
|
85
|
+
* type: "object",
|
|
86
|
+
* properties: {
|
|
87
|
+
* id: { description: "User ID", type: "number" },
|
|
88
|
+
* name: { description: "User name", type: "string" }
|
|
89
|
+
* }
|
|
90
|
+
* },
|
|
91
|
+
* examples: ["LOAD JSON FROM fetchUsers('https://api.example.com/users') AS user"]
|
|
92
|
+
* }
|
|
93
|
+
* });
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
static registerAsyncProvider(name, providerOrOptions) {
|
|
97
|
+
const lowerName = name.toLowerCase();
|
|
98
|
+
if (typeof providerOrOptions === 'function') {
|
|
99
|
+
FunctionFactory.asyncProviders.set(lowerName, providerOrOptions);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
FunctionFactory.asyncProviders.set(lowerName, providerOrOptions.provider);
|
|
103
|
+
FunctionFactory.metadata.set(lowerName, Object.assign(Object.assign({}, providerOrOptions.metadata), { name: lowerName, isAsyncProvider: true }));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Unregisters an async data provider function.
|
|
108
|
+
*
|
|
109
|
+
* @param name - The function name to unregister
|
|
110
|
+
*/
|
|
111
|
+
static unregisterAsyncProvider(name) {
|
|
112
|
+
const lowerName = name.toLowerCase();
|
|
113
|
+
FunctionFactory.asyncProviders.delete(lowerName);
|
|
114
|
+
FunctionFactory.metadata.delete(lowerName);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Gets an async data provider by name.
|
|
118
|
+
*
|
|
119
|
+
* @param name - The function name (case-insensitive)
|
|
120
|
+
* @returns The async data provider, or undefined if not found
|
|
121
|
+
*/
|
|
122
|
+
static getAsyncProvider(name) {
|
|
123
|
+
return FunctionFactory.asyncProviders.get(name.toLowerCase());
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Checks if a function name is registered as an async data provider.
|
|
127
|
+
*
|
|
128
|
+
* @param name - The function name (case-insensitive)
|
|
129
|
+
* @returns True if the function is an async data provider
|
|
130
|
+
*/
|
|
131
|
+
static isAsyncProvider(name) {
|
|
132
|
+
return FunctionFactory.asyncProviders.has(name.toLowerCase());
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Gets metadata for a specific function.
|
|
136
|
+
*
|
|
137
|
+
* @param name - The function name (case-insensitive)
|
|
138
|
+
* @returns The function metadata, or undefined if not found
|
|
139
|
+
*/
|
|
140
|
+
static getMetadata(name) {
|
|
141
|
+
const lowerName = name.toLowerCase();
|
|
142
|
+
// Check plugin metadata first
|
|
143
|
+
if (FunctionFactory.metadata.has(lowerName)) {
|
|
144
|
+
return FunctionFactory.metadata.get(lowerName);
|
|
145
|
+
}
|
|
146
|
+
// Fall back to built-in metadata
|
|
147
|
+
return function_metadata_1.BUILTIN_FUNCTION_METADATA.find(m => m.name === lowerName);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Lists all registered functions with their metadata.
|
|
151
|
+
* Includes both built-in and plugin functions.
|
|
152
|
+
*
|
|
153
|
+
* @param options - Optional filter options
|
|
154
|
+
* @returns Array of function metadata
|
|
155
|
+
*/
|
|
156
|
+
static listFunctions(options) {
|
|
157
|
+
const result = [];
|
|
158
|
+
const includeBuiltins = (options === null || options === void 0 ? void 0 : options.includeBuiltins) !== false;
|
|
159
|
+
// Add built-in functions
|
|
160
|
+
if (includeBuiltins) {
|
|
161
|
+
for (const meta of function_metadata_1.BUILTIN_FUNCTION_METADATA) {
|
|
162
|
+
if ((options === null || options === void 0 ? void 0 : options.category) && meta.category !== options.category)
|
|
163
|
+
continue;
|
|
164
|
+
if (options === null || options === void 0 ? void 0 : options.asyncOnly)
|
|
165
|
+
continue; // Built-ins are sync
|
|
166
|
+
result.push(meta);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Add plugin functions
|
|
170
|
+
for (const [name, meta] of FunctionFactory.metadata) {
|
|
171
|
+
if ((options === null || options === void 0 ? void 0 : options.category) && meta.category !== options.category)
|
|
172
|
+
continue;
|
|
173
|
+
if ((options === null || options === void 0 ? void 0 : options.asyncOnly) && !meta.isAsyncProvider)
|
|
174
|
+
continue;
|
|
175
|
+
if ((options === null || options === void 0 ? void 0 : options.syncOnly) && meta.isAsyncProvider)
|
|
176
|
+
continue;
|
|
177
|
+
result.push(meta);
|
|
178
|
+
}
|
|
179
|
+
return result;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Lists all registered function names.
|
|
183
|
+
*
|
|
184
|
+
* @returns Array of function names
|
|
185
|
+
*/
|
|
186
|
+
static listFunctionNames() {
|
|
187
|
+
const builtinNames = function_metadata_1.BUILTIN_FUNCTION_METADATA.map(m => m.name);
|
|
188
|
+
const pluginNames = Array.from(FunctionFactory.plugins.keys());
|
|
189
|
+
const asyncNames = Array.from(FunctionFactory.asyncProviders.keys());
|
|
190
|
+
return [...new Set([...builtinNames, ...pluginNames, ...asyncNames])];
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Gets all function metadata as a JSON-serializable object for LLM consumption.
|
|
194
|
+
*
|
|
195
|
+
* @returns Object with functions grouped by category
|
|
196
|
+
*/
|
|
197
|
+
static toJSON() {
|
|
198
|
+
const functions = FunctionFactory.listFunctions();
|
|
199
|
+
const categories = [...new Set(functions.map(f => f.category).filter(Boolean))];
|
|
200
|
+
return { functions, categories };
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Creates a function instance by name.
|
|
204
|
+
*
|
|
205
|
+
* @param name - The function name (case-insensitive)
|
|
206
|
+
* @returns A Function instance of the appropriate type
|
|
207
|
+
*/
|
|
208
|
+
static create(name) {
|
|
209
|
+
const lowerName = name.toLowerCase();
|
|
210
|
+
// Check plugin registry first (allows overriding built-ins)
|
|
211
|
+
if (FunctionFactory.plugins.has(lowerName)) {
|
|
212
|
+
return FunctionFactory.plugins.get(lowerName)();
|
|
213
|
+
}
|
|
214
|
+
switch (lowerName) {
|
|
215
|
+
case "sum":
|
|
216
|
+
return new sum_1.default();
|
|
217
|
+
case "collect":
|
|
218
|
+
return new collect_1.default();
|
|
219
|
+
case "avg":
|
|
220
|
+
return new avg_1.default();
|
|
221
|
+
case "range":
|
|
222
|
+
return new range_1.default();
|
|
223
|
+
case "rand":
|
|
224
|
+
return new rand_1.default();
|
|
225
|
+
case "round":
|
|
226
|
+
return new round_1.default();
|
|
227
|
+
case "split":
|
|
228
|
+
return new split_1.default();
|
|
229
|
+
case "join":
|
|
230
|
+
return new join_1.default();
|
|
231
|
+
case "tojson":
|
|
232
|
+
return new to_json_1.default();
|
|
233
|
+
case "replace":
|
|
234
|
+
return new replace_1.default();
|
|
235
|
+
case "stringify":
|
|
236
|
+
return new stringify_1.default();
|
|
237
|
+
case "size":
|
|
238
|
+
return new size_1.default();
|
|
239
|
+
case "functions":
|
|
240
|
+
return new functions_1.default();
|
|
241
|
+
default:
|
|
242
|
+
return new function_1.default(name);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Registry for plugin functions (synchronous).
|
|
248
|
+
*/
|
|
249
|
+
FunctionFactory.plugins = new Map();
|
|
250
|
+
/**
|
|
251
|
+
* Registry for async data provider functions used in LOAD operations.
|
|
252
|
+
*/
|
|
253
|
+
FunctionFactory.asyncProviders = new Map();
|
|
254
|
+
/**
|
|
255
|
+
* Registry for function metadata (both sync and async).
|
|
256
|
+
*/
|
|
257
|
+
FunctionFactory.metadata = new Map();
|
|
258
|
+
exports.default = FunctionFactory;
|
|
259
|
+
//# sourceMappingURL=function_factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function_factory.js","sourceRoot":"","sources":["../../../src/parsing/functions/function_factory.ts"],"names":[],"mappings":"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"}
|