@webda/ql 4.0.0-beta.2 → 4.0.0-beta.5

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.
Files changed (48) hide show
  1. package/README.md +135 -2
  2. package/lib/WebdaQLLexer.d.ts +19 -13
  3. package/lib/WebdaQLLexer.d.ts.map +1 -1
  4. package/lib/WebdaQLLexer.js +305 -252
  5. package/lib/WebdaQLLexer.js.map +1 -1
  6. package/lib/WebdaQLParserLexer.d.ts +19 -13
  7. package/lib/WebdaQLParserLexer.d.ts.map +1 -1
  8. package/lib/WebdaQLParserLexer.js +305 -252
  9. package/lib/WebdaQLParserLexer.js.map +1 -1
  10. package/lib/WebdaQLParserListener.d.ts +89 -3
  11. package/lib/WebdaQLParserListener.d.ts.map +1 -1
  12. package/lib/WebdaQLParserListener.js +1 -1
  13. package/lib/WebdaQLParserListener.js.map +1 -1
  14. package/lib/WebdaQLParserParser.d.ts +83 -22
  15. package/lib/WebdaQLParserParser.d.ts.map +1 -1
  16. package/lib/WebdaQLParserParser.js +790 -290
  17. package/lib/WebdaQLParserParser.js.map +1 -1
  18. package/lib/WebdaQLParserVisitor.d.ts +65 -2
  19. package/lib/WebdaQLParserVisitor.d.ts.map +1 -1
  20. package/lib/WebdaQLParserVisitor.js +1 -1
  21. package/lib/WebdaQLParserVisitor.js.map +1 -1
  22. package/lib/bind.d.ts +29 -0
  23. package/lib/bind.d.ts.map +1 -0
  24. package/lib/bind.js +139 -0
  25. package/lib/bind.js.map +1 -0
  26. package/lib/bind.spec.d.ts +2 -0
  27. package/lib/bind.spec.d.ts.map +1 -0
  28. package/lib/bind.spec.js +206 -0
  29. package/lib/bind.spec.js.map +1 -0
  30. package/lib/index.d.ts +4 -0
  31. package/lib/index.d.ts.map +1 -0
  32. package/lib/index.js +4 -0
  33. package/lib/index.js.map +1 -0
  34. package/lib/query.d.ts +395 -76
  35. package/lib/query.d.ts.map +1 -1
  36. package/lib/query.js +562 -91
  37. package/lib/query.js.map +1 -1
  38. package/lib/query.spec.js +593 -195
  39. package/lib/query.spec.js.map +1 -1
  40. package/lib/webdaql-string.d.ts +59 -0
  41. package/lib/webdaql-string.d.ts.map +1 -0
  42. package/lib/webdaql-string.js +112 -0
  43. package/lib/webdaql-string.js.map +1 -0
  44. package/lib/webdaql-string.spec.d.ts +2 -0
  45. package/lib/webdaql-string.spec.d.ts.map +1 -0
  46. package/lib/webdaql-string.spec.js +282 -0
  47. package/lib/webdaql-string.spec.js.map +1 -0
  48. package/package.json +34 -42
package/README.md CHANGED
@@ -1,3 +1,136 @@
1
- # @webda/webdaql
1
+ # @webda/ql module
2
2
 
3
- This is a package for WebdaQL, a query language for Webda.
3
+ This module is part of Webda Application Framework that allows you to quickly develop applications with all modern prerequisites: Security, Extensibility, GraphQL, REST, CloudNative [https://webda.io](https://webda.io)
4
+
5
+ <img src="https://webda.io/images/webda.svg" width="128" />
6
+
7
+ ![CI](https://github.com/loopingz/webda.io/workflows/CI/badge.svg)
8
+
9
+ [![Join the chat at https://gitter.im/loopingz/webda](https://badges.gitter.im/loopingz/webda.svg)](https://gitter.im/loopingz/webda?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
10
+ [![codecov](https://codecov.io/gh/loopingz/webda.io/branch/main/graph/badge.svg?token=8N9DNM3K3O)](https://codecov.io/gh/loopingz/webda.io)
11
+ [![SonarCloud.io](https://sonarcloud.io/api/project_badges/measure?project=loopingz_webda.io&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=loopingz_webda.io)
12
+ ![CodeQL](https://github.com/loopingz/webda.io/workflows/CodeQL/badge.svg)
13
+
14
+ <!-- README_HEADER -->
15
+
16
+ ## @webda/ql — WebdaQL
17
+
18
+ A structured query language (WQL) for filtering and paginating Webda Store results. WQL queries are parsed by an ANTLR4 grammar and translated to native backend queries by each Store implementation (in-memory, MongoDB, PostgreSQL, DynamoDB).
19
+
20
+ ### When to use it
21
+
22
+ You need WQL when you call `store.query()` or a relation's `.query()` method. Every Webda Store accepts a WQL string; no raw SQL, MongoDB filter objects, or DynamoDB conditions needed.
23
+
24
+ ```typescript
25
+ // Query the User repository
26
+ const { results } = await User.getRepository().query(
27
+ `email = 'alice@example.com' LIMIT 1`
28
+ );
29
+
30
+ // Query a relation
31
+ const { results: posts } = await user.posts.query(
32
+ `status = 'published' ORDER BY createdAt DESC LIMIT 10`
33
+ );
34
+ ```
35
+
36
+ ### Install
37
+
38
+ ```bash
39
+ npm install @webda/ql
40
+ ```
41
+
42
+ > This package is a dependency of `@webda/core` — you rarely need to install it directly.
43
+
44
+ ### Syntax overview
45
+
46
+ ```
47
+ expression? orderExpression? limitExpression? offsetExpression?
48
+ ```
49
+
50
+ **Filter expressions** support:
51
+ - Comparison: `field = value`, `field != value`, `field > value`, `field >= value`, `field < value`, `field <= value`
52
+ - Pattern match: `field LIKE "pattern"` (`_` = single char, `%` = any chars)
53
+ - Set membership: `field IN [value, value, ...]`
54
+ - Array contains: `field CONTAINS value`
55
+ - Null checks: `field IS NULL`, `field IS NOT NULL` (missing, `undefined` or `null`)
56
+ - Logic: `AND`, `OR`, `( ... )`
57
+
58
+ **Pagination / ordering:**
59
+ - `ORDER BY field [ASC|DESC], ...`
60
+ - `LIMIT <integer>`
61
+ - `OFFSET "<continuationToken>"`
62
+
63
+ ### Quick examples
64
+
65
+ ```typescript
66
+ import * as WebdaQL from "@webda/ql";
67
+
68
+ // Parse and evaluate against an in-memory object
69
+ const validator = new WebdaQL.QueryValidator(
70
+ `status = 'published' AND viewCount >= 100`
71
+ );
72
+ const post = { status: "published", viewCount: 150 };
73
+ console.log(validator.eval(post)); // true
74
+
75
+ // Prepend a mandatory condition to a user-supplied query
76
+ const merged = WebdaQL.PrependCondition(
77
+ `status = 'published' ORDER BY title LIMIT 10`,
78
+ `authorId = 'u-123'`
79
+ );
80
+ // => 'status = "published" AND authorId = "u-123" ORDER BY title ASC LIMIT 10'
81
+ ```
82
+
83
+ ### Parameters
84
+
85
+ Never concatenate user input into a query. Pass values as parameters instead, with `?` and an array or `:name` and an object:
86
+
87
+ ```typescript
88
+ await Task.query("owner = ? AND status IN ?", [user, ["open", "late"]]);
89
+ await Task.query("owner = :owner OR reviewer = :owner", { owner: user });
90
+
91
+ WebdaQL.bind("priority >= ? LIMIT ?", [2, 10]); // priority >= 2 LIMIT 10
92
+ ```
93
+
94
+ Placeholders are only allowed where a value is expected, values are escaped by type, and `= ?` / `!= ?` with `null` become `IS NULL` / `IS NOT NULL`. Template literals passed straight to a query method are escaped the same way at compile time by `webdac`. See [Parameters](../../docs/pages/Modules/ql/Parameters.md).
95
+
96
+ ### API reference
97
+
98
+ | Export | Description |
99
+ |--------|-------------|
100
+ | `QueryValidator` | Parses a WQL string; `eval(obj)` evaluates it, `toString()` normalizes it |
101
+ | `bind(query, params)` | Binds `?` / `:name` placeholders to escaped values |
102
+ | `escape(parts, values)` | Escapes template literal values (used by the compile-time rewrite) |
103
+ | `validateSyntax(query)` | Checks a query against the grammar without evaluating it; placeholders allowed |
104
+ | `PrependCondition(query, condition)` | Merges a condition in front of an existing query, preserving ORDER BY / LIMIT / OFFSET |
105
+ | `ExpressionBuilder` | ANTLR visitor that builds the optimized expression AST |
106
+ | `AndExpression` | Logic AND node |
107
+ | `OrExpression` | Logic OR node |
108
+ | `ComparisonExpression` | Comparison leaf node |
109
+ | `Query` | Parsed query result: `{ filter, orderBy?, limit?, continuationToken? }` |
110
+ | `OrderBy` | `{ field: string; direction: "ASC" \| "DESC" }` |
111
+
112
+ ### See also
113
+
114
+ - [WQL Syntax reference](../../docs/pages/Modules/ql/Syntax.md)
115
+ - [Operators](../../docs/pages/Modules/ql/Operators.md)
116
+ - [Parameters](../../docs/pages/Modules/ql/Parameters.md) — binding values safely
117
+ - [Store Translators](../../docs/pages/Modules/ql/Translators.md) — how each Store backend converts WQL
118
+
119
+ <!-- README_FOOTER -->
120
+ ## Sponsors
121
+
122
+ <!--
123
+ Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor](mailto:sponsor@webda.io)
124
+ -->
125
+
126
+ Arize AI is a machine learning observability and model monitoring platform. It helps you visualize, monitor, and explain your machine learning models. [Learn more](https://arize.com)
127
+
128
+ [<img src="https://arize.com/hubfs/arize/brand/arize-logomark-1.png" width="200">](https://arize.com)
129
+
130
+ Loopingz is a software development company that provides consulting and development services. [Learn more](https://loopingz.com)
131
+
132
+ [<img src="https://loopingz.com/images/logo.png" width="200">](https://loopingz.com)
133
+
134
+ Tellae is an innovative consulting firm specialized in cities transportation issues. We provide our clients, both public and private, with solutions to support your strategic and operational decisions. [Learn more](https://tellae.fr)
135
+
136
+ [<img src="https://tellae.fr/" width="200">](https://tellae.fr)
@@ -22,19 +22,25 @@ export declare class WebdaQLLexer extends Lexer {
22
22
  static readonly LIKE = 17;
23
23
  static readonly IN = 18;
24
24
  static readonly CONTAINS = 19;
25
- static readonly TRUE = 20;
26
- static readonly FALSE = 21;
27
- static readonly LIMIT = 22;
28
- static readonly OFFSET = 23;
29
- static readonly ORDER_BY = 24;
30
- static readonly ASC = 25;
31
- static readonly DESC = 26;
32
- static readonly DQUOTED_STRING_LITERAL = 27;
33
- static readonly SQUOTED_STRING_LITERAL = 28;
34
- static readonly INTEGER_LITERAL = 29;
35
- static readonly IDENTIFIER = 30;
36
- static readonly IDENTIFIER_WITH_NUMBER = 31;
37
- static readonly FUNCTION_IDENTIFIER_WITH_UNDERSCORE = 32;
25
+ static readonly IS = 20;
26
+ static readonly NOT = 21;
27
+ static readonly NULL = 22;
28
+ static readonly TRUE = 23;
29
+ static readonly FALSE = 24;
30
+ static readonly LIMIT = 25;
31
+ static readonly OFFSET = 26;
32
+ static readonly ORDER_BY = 27;
33
+ static readonly ASC = 28;
34
+ static readonly DESC = 29;
35
+ static readonly DQUOTED_STRING_LITERAL = 30;
36
+ static readonly SQUOTED_STRING_LITERAL = 31;
37
+ static readonly INTEGER_LITERAL = 32;
38
+ static readonly NUMBER_LITERAL = 33;
39
+ static readonly POSITIONAL_PARAMETER = 34;
40
+ static readonly NAMED_PARAMETER = 35;
41
+ static readonly IDENTIFIER = 36;
42
+ static readonly IDENTIFIER_WITH_NUMBER = 37;
43
+ static readonly FUNCTION_IDENTIFIER_WITH_UNDERSCORE = 38;
38
44
  static readonly channelNames: string[];
39
45
  static readonly modeNames: string[];
40
46
  static readonly ruleNames: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"WebdaQLLexer.d.ts","sourceRoot":"","sources":["../src/WebdaQLLexer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAGvC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKjD,qBAAa,YAAa,SAAQ,KAAK;IACrC,gBAAuB,KAAK,KAAK;IACjC,gBAAuB,UAAU,KAAK;IACtC,gBAAuB,UAAU,KAAK;IACtC,gBAAuB,KAAK,KAAK;IACjC,gBAAuB,iBAAiB,KAAK;IAC7C,gBAAuB,iBAAiB,KAAK;IAC7C,gBAAuB,aAAa,KAAK;IACzC,gBAAuB,aAAa,KAAK;IACzC,gBAAuB,GAAG,KAAK;IAC/B,gBAAuB,EAAE,MAAM;IAC/B,gBAAuB,KAAK,MAAM;IAClC,gBAAuB,SAAS,MAAM;IACtC,gBAAuB,OAAO,MAAM;IACpC,gBAAuB,gBAAgB,MAAM;IAC7C,gBAAuB,IAAI,MAAM;IACjC,gBAAuB,aAAa,MAAM;IAC1C,gBAAuB,IAAI,MAAM;IACjC,gBAAuB,EAAE,MAAM;IAC/B,gBAAuB,QAAQ,MAAM;IACrC,gBAAuB,IAAI,MAAM;IACjC,gBAAuB,KAAK,MAAM;IAClC,gBAAuB,KAAK,MAAM;IAClC,gBAAuB,MAAM,MAAM;IACnC,gBAAuB,QAAQ,MAAM;IACrC,gBAAuB,GAAG,MAAM;IAChC,gBAAuB,IAAI,MAAM;IACjC,gBAAuB,sBAAsB,MAAM;IACnD,gBAAuB,sBAAsB,MAAM;IACnD,gBAAuB,eAAe,MAAM;IAC5C,gBAAuB,UAAU,MAAM;IACvC,gBAAuB,sBAAsB,MAAM;IACnD,gBAAuB,mCAAmC,MAAM;IAGhE,gBAAuB,YAAY,EAAE,MAAM,EAAE,CAAuC;IAGpF,gBAAuB,SAAS,EAAE,MAAM,EAAE,CAAoB;IAE9D,gBAAuB,SAAS,EAAE,MAAM,EAAE,CAuCxC;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CA4BpC;IACF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAkCrC;IACF,gBAAuB,UAAU,EAAE,UAAU,CAI3C;IAIF,IAAW,UAAU,IAAI,UAAU,CAElC;gBAGW,KAAK,EAAE,UAAU;IAM7B,IAAW,eAAe,IAAI,MAAM,CAEnC;IAGD,IAAW,SAAS,IAAI,MAAM,EAAE,CAE/B;IAGD,IAAW,aAAa,IAAI,MAAM,CAEjC;IAGD,IAAW,YAAY,IAAI,MAAM,EAAE,CAElC;IAGD,IAAW,SAAS,IAAI,MAAM,EAAE,CAE/B;IAED,gBAAuB,cAAc,EAAE,MAAM,CA6G1B;IACnB,OAAc,KAAK,EAAE,GAAG,CAAC;IACzB,WAAkB,IAAI,IAAI,GAAG,CAM5B;CACF"}
1
+ {"version":3,"file":"WebdaQLLexer.d.ts","sourceRoot":"","sources":["../src/WebdaQLLexer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAK1C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAKpD,qBAAa,YAAa,SAAQ,KAAK;IACrC,gBAAuB,KAAK,KAAK;IACjC,gBAAuB,UAAU,KAAK;IACtC,gBAAuB,UAAU,KAAK;IACtC,gBAAuB,KAAK,KAAK;IACjC,gBAAuB,iBAAiB,KAAK;IAC7C,gBAAuB,iBAAiB,KAAK;IAC7C,gBAAuB,aAAa,KAAK;IACzC,gBAAuB,aAAa,KAAK;IACzC,gBAAuB,GAAG,KAAK;IAC/B,gBAAuB,EAAE,MAAM;IAC/B,gBAAuB,KAAK,MAAM;IAClC,gBAAuB,SAAS,MAAM;IACtC,gBAAuB,OAAO,MAAM;IACpC,gBAAuB,gBAAgB,MAAM;IAC7C,gBAAuB,IAAI,MAAM;IACjC,gBAAuB,aAAa,MAAM;IAC1C,gBAAuB,IAAI,MAAM;IACjC,gBAAuB,EAAE,MAAM;IAC/B,gBAAuB,QAAQ,MAAM;IACrC,gBAAuB,EAAE,MAAM;IAC/B,gBAAuB,GAAG,MAAM;IAChC,gBAAuB,IAAI,MAAM;IACjC,gBAAuB,IAAI,MAAM;IACjC,gBAAuB,KAAK,MAAM;IAClC,gBAAuB,KAAK,MAAM;IAClC,gBAAuB,MAAM,MAAM;IACnC,gBAAuB,QAAQ,MAAM;IACrC,gBAAuB,GAAG,MAAM;IAChC,gBAAuB,IAAI,MAAM;IACjC,gBAAuB,sBAAsB,MAAM;IACnD,gBAAuB,sBAAsB,MAAM;IACnD,gBAAuB,eAAe,MAAM;IAC5C,gBAAuB,cAAc,MAAM;IAC3C,gBAAuB,oBAAoB,MAAM;IACjD,gBAAuB,eAAe,MAAM;IAC5C,gBAAuB,UAAU,MAAM;IACvC,gBAAuB,sBAAsB,MAAM;IACnD,gBAAuB,mCAAmC,MAAM;IAGhE,gBAAuB,YAAY,EAAE,MAAM,EAAE,CAAuC;IAGpF,gBAAuB,SAAS,EAAE,MAAM,EAAE,CAAoB;IAE9D,gBAAuB,SAAS,EAAE,MAAM,EAAE,CA6CxC;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAoCpC;IACF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAwCrC;IACF,gBAAuB,UAAU,EAAE,UAAU,CAI3C;IAIF,IAAW,UAAU,IAAI,UAAU,CAElC;IAGD,YAAY,KAAK,EAAE,UAAU,EAG5B;IAGD,IAAW,eAAe,IAAI,MAAM,CAEnC;IAGD,IAAW,SAAS,IAAI,MAAM,EAAE,CAE/B;IAGD,IAAW,aAAa,IAAI,MAAM,CAEjC;IAGD,IAAW,YAAY,IAAI,MAAM,EAAE,CAElC;IAGD,IAAW,SAAS,IAAI,MAAM,EAAE,CAE/B;IAED,gBAAuB,cAAc,EAAE,MAAM,CAuIU;IACvD,OAAc,KAAK,EAAE,GAAG,CAAC;IACzB,WAAkB,IAAI,IAAI,GAAG,CAM5B;CACF"}