From 68d04deafc83c70b817394f008ac238714e95e46 Mon Sep 17 00:00:00 2001 From: Kijin-Seija Date: Wed, 15 May 2024 19:35:40 +0800 Subject: [PATCH] update Readme --- README.md | 32 +++++++++++++++++++++++++++++++- assets/alias-example.png | Bin 0 -> 13635 bytes 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 assets/alias-example.png diff --git a/README.md b/README.md index 4f79870..aa82e08 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # dt-sql-parser-semantic-analyse-plugin -A [dt-sql-parser](https://github.com/DTStack/dt-sql-parser) plugin with semantic result. [Theory](https://github.com/Kijin-Seija/dt-sql-parser-analyse-demo). +A [dt-sql-parser](https://github.com/DTStack/dt-sql-parser) plugin with semantic result. [Theory(zh-CN)](https://github.com/Kijin-Seija/dt-sql-parser-analyse-demo). ## Installation @@ -29,6 +29,10 @@ import { PostgreSQLParser } from 'dt-sql-parser/dist/lib/pgsql/PostgreSQLParser' const myPlugin = new DtSqlParserSemAnalysePlugin({ parse: { parser: new PostgresSQL() + alias: { + selectstmt: 'selectStatement', + target_el: 'target_label' + } stmts: [ 'selectstmt' ], @@ -51,6 +55,32 @@ console.log(result) **Notice: A rule must start with a/an statement/entity and stop with an entity. You should add a node keywords(keyword is in your parser with format: `RULE_[keyword]`) into stmts/entities before using it.** +## Rule Chain Opeator + +You can set a negative number whose abs equals to a ruleIndex. That means exclude this rule. + +Example: + +```typescript +select_target_alias: [ + PostgreSqlParser.RULE_target_el, + -PostgreSqlParser.RULE_attr_name, + PostgreSqlParser.RULE_collabel +] +``` + +🚧 I will later work on `Operator.AND` and `Operator.OR`. + +## Alias + +Some node names in dt-sql-parser code are different from its antlr4's definition. + +You can find possible alias in https://github.com/DTStack/dt-sql-parser/blob/main/src/grammar/postgresql/PostgreSqlParser.g4, then add it into `alias` option. + +Example: +![alt text](./assets/alias-example.png) + + ## Add a preprocessor ```typescript diff --git a/assets/alias-example.png b/assets/alias-example.png new file mode 100644 index 0000000000000000000000000000000000000000..9163f2af8b3f9c6a9b396ae4e7e3e642acb26578 GIT binary patch literal 13635 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