From a6a170efbb1a58192145e157671714d5e87869e5 Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Fri, 2 Dec 2022 19:17:54 +0300 Subject: [PATCH 1/4] =?UTF-8?q?=D0=A2=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B?= =?UTF-8?q?=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD=D0=B8=D1=85=20=D0=B8=D1=81?= =?UTF-8?q?=D1=82=D0=BE=D1=87=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/antlr/SDBLLexer.g4 | 3 +++ src/main/antlr/SDBLParser.g4 | 1 + .../com/github/_1c_syntax/bsl/parser/SDBLLexerTest.java | 5 +++++ .../com/github/_1c_syntax/bsl/parser/SDBLParserTest.java | 8 ++++++++ src/test/resources/sdbl/select06.sdbl | 4 ++++ 5 files changed, 21 insertions(+) create mode 100644 src/test/resources/sdbl/select06.sdbl diff --git a/src/main/antlr/SDBLLexer.g4 b/src/main/antlr/SDBLLexer.g4 index f085fff2..84d3587d 100644 --- a/src/main/antlr/SDBLLexer.g4 +++ b/src/main/antlr/SDBLLexer.g4 @@ -331,6 +331,9 @@ TASK_BY_PERFORMER_VT: | T A S K B Y P E R F O R M E R) -> popMode; TURNOVERS_VT: (TURNOVERS_RU | TURNOVERS_EN) -> popMode; +// external data sourse type +EXTERNAL_TABLE_TYPE: (RU_T RU_A RU_B RU_L RU_I RU_C RU_A | T A B L E) -> popMode; + DOT_IDENTIFIER : IDENTIFIER -> type(IDENTIFIER), popMode; mode BRACE_MODE; diff --git a/src/main/antlr/SDBLParser.g4 b/src/main/antlr/SDBLParser.g4 index 02e71a1c..84239d72 100644 --- a/src/main/antlr/SDBLParser.g4 +++ b/src/main/antlr/SDBLParser.g4 @@ -317,6 +317,7 @@ dataSource: table: mdo | mdo DOT objectTableName=identifier + | mdo DOT EXTERNAL_TABLE_TYPE DOT externalTableName=identifier | tableName=identifier ; diff --git a/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLLexerTest.java b/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLLexerTest.java index 54612b28..055ea3bc 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLLexerTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLLexerTest.java @@ -177,4 +177,9 @@ void testMDOTT() { assertMatch(".ДанныеГрафика", ".SCHEDULEDATA", SDBLLexer.DOT, SDBLLexer.SCHEDULE_DATA_VT); assertMatch(".ЗадачиПоИсполнителю", ".TASKBYPERFORMER", SDBLLexer.DOT, SDBLLexer.TASK_BY_PERFORMER_VT); } + + @Test + void testExternalTypes() { + assertMatch(".Таблица", ".table", SDBLLexer.DOT, SDBLLexer.EXTERNAL_TABLE_TYPE); + } } diff --git a/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLParserTest.java b/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLParserTest.java index fcbc131d..00cdbbb3 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLParserTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLParserTest.java @@ -300,6 +300,14 @@ void testSelect05() { ); } + @Test + void testSelect06() { + checkSource("src/test/resources/sdbl/select06.sdbl", + pair(SDBLParser.RULE_queries, 1), + pair(SDBLParser.RULE_dataSource, 1) + ); + } + private void checkSource(String filePath, Pair... rules) { var exampleString = TestUtils.getSourceFromFile(filePath); setInput(exampleString); diff --git a/src/test/resources/sdbl/select06.sdbl b/src/test/resources/sdbl/select06.sdbl new file mode 100644 index 00000000..ab09788e --- /dev/null +++ b/src/test/resources/sdbl/select06.sdbl @@ -0,0 +1,4 @@ +ВЫБРАТЬ +timestamp +ИЗ +ВнешнийИсточникДанных.ClickHouse.Таблица.test01_log \ No newline at end of file From 3fb968c752fc7935255d237a47175b80b2effd50 Mon Sep 17 00:00:00 2001 From: Dima Date: Sat, 3 Dec 2022 12:32:38 +0300 Subject: [PATCH 2/4] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=20=D0=BF=D0=B0=D1=80=D1=81=D0=B8=D0=BD=D0=B3?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=BE=D0=B2=20=D0=BA=20?= =?UTF-8?q?=D0=B2=D0=BD=D0=B5=D1=88=D0=BD=D0=B8=D0=BC=20=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D1=87=D0=BD=D0=B8=D0=BA=D0=B0=D0=BC=20=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/antlr/SDBLLexer.g4 | 11 +++++++++-- src/main/antlr/SDBLParser.g4 | 3 ++- .../_1c_syntax/bsl/parser/SDBLLexerTest.java | 4 +++- .../_1c_syntax/bsl/parser/SDBLParserTest.java | 4 ++-- src/test/resources/sdbl/select06.sdbl | 17 ++++++++++++++++- 5 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/main/antlr/SDBLLexer.g4 b/src/main/antlr/SDBLLexer.g4 index 84d3587d..64fb815e 100644 --- a/src/main/antlr/SDBLLexer.g4 +++ b/src/main/antlr/SDBLLexer.g4 @@ -331,8 +331,15 @@ TASK_BY_PERFORMER_VT: | T A S K B Y P E R F O R M E R) -> popMode; TURNOVERS_VT: (TURNOVERS_RU | TURNOVERS_EN) -> popMode; -// external data sourse type -EXTERNAL_TABLE_TYPE: (RU_T RU_A RU_B RU_L RU_I RU_C RU_A | T A B L E) -> popMode; +// external data source table +EXTERNAL_DATA_SOURCE_TABLE: (RU_T RU_A RU_B RU_L RU_I RU_C RU_A | T A B L E) -> popMode; + +// external data source cube +EXTERNAL_DATA_SOURCE_CUBE: (RU_K RU_U RU_B | C U B E) -> popMode; + +// external data source cube dimension table +EXTERNAL_DATA_SOURCE_CUBE_DIMTABLE: (RU_T RU_A RU_B RU_L RU_I RU_C RU_A RU_I RU_Z RU_M RU_E RU_R RU_E RU_N RU_I RU_YA + | D I M E N S I O N T A B L E) -> popMode; DOT_IDENTIFIER : IDENTIFIER -> type(IDENTIFIER), popMode; diff --git a/src/main/antlr/SDBLParser.g4 b/src/main/antlr/SDBLParser.g4 index 84239d72..85c85814 100644 --- a/src/main/antlr/SDBLParser.g4 +++ b/src/main/antlr/SDBLParser.g4 @@ -317,7 +317,8 @@ dataSource: table: mdo | mdo DOT objectTableName=identifier - | mdo DOT EXTERNAL_TABLE_TYPE DOT externalTableName=identifier + | mdo DOT EXTERNAL_DATA_SOURCE_TABLE DOT externalTableName=identifier + | mdo DOT EXTERNAL_DATA_SOURCE_CUBE DOT externalTableCubeName=identifier DOT EXTERNAL_DATA_SOURCE_CUBE_DIMTABLE DOT externalTableName=identifier | tableName=identifier ; diff --git a/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLLexerTest.java b/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLLexerTest.java index 055ea3bc..0f1b85cc 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLLexerTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLLexerTest.java @@ -180,6 +180,8 @@ void testMDOTT() { @Test void testExternalTypes() { - assertMatch(".Таблица", ".table", SDBLLexer.DOT, SDBLLexer.EXTERNAL_TABLE_TYPE); + assertMatch(".Таблица", ".Table", SDBLLexer.DOT, SDBLLexer.EXTERNAL_DATA_SOURCE_TABLE); + assertMatch(".Куб", ".Cube", SDBLLexer.DOT, SDBLLexer.EXTERNAL_DATA_SOURCE_CUBE); + assertMatch(".ТаблицаИзмерения", ".DimensionTable", SDBLLexer.DOT, SDBLLexer.EXTERNAL_DATA_SOURCE_CUBE_DIMTABLE); } } diff --git a/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLParserTest.java b/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLParserTest.java index 00cdbbb3..f871067a 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLParserTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLParserTest.java @@ -303,8 +303,8 @@ void testSelect05() { @Test void testSelect06() { checkSource("src/test/resources/sdbl/select06.sdbl", - pair(SDBLParser.RULE_queries, 1), - pair(SDBLParser.RULE_dataSource, 1) + pair(SDBLParser.RULE_queries, 4), + pair(SDBLParser.RULE_dataSource, 4) ); } diff --git a/src/test/resources/sdbl/select06.sdbl b/src/test/resources/sdbl/select06.sdbl index ab09788e..b3484e8e 100644 --- a/src/test/resources/sdbl/select06.sdbl +++ b/src/test/resources/sdbl/select06.sdbl @@ -1,4 +1,19 @@ ВЫБРАТЬ timestamp ИЗ -ВнешнийИсточникДанных.ClickHouse.Таблица.test01_log \ No newline at end of file +ВнешнийИсточникДанных.ClickHouse.Таблица.test01_log +; +SELECT +timestamp +FROM +ExternalDataSource.ClickHouse.Table.test01_log +; +ВЫБРАТЬ +Поле1 КАК Поле1 +ИЗ +ВнешнийИсточникДанных.ВнешнийИсточникДанных1.Куб.Куб1.ТаблицаИзмерения.ТаблицаИзмерения1 +; +SELECT +Cube1DimensionTableDimensionTable1.Ref AS Ref +FROM +ExternalDataSource.ExternalDataSource1.Cube.Cube1.DimensionTable.DimensionTable1 AS Cube1DimensionTableDimensionTable1 \ No newline at end of file From 9041fc3adfecf594b6b71298f0fc79772dd70e56 Mon Sep 17 00:00:00 2001 From: Dima Date: Sun, 4 Dec 2022 14:55:56 +0300 Subject: [PATCH 3/4] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20mode=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D1=85=20=D0=B8=D1=81=D1=82=D0=BE=D1=87=D0=BD=D0=B8=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/antlr/SDBLLexer.g4 | 24 +++++++++---------- src/main/antlr/SDBLParser.g4 | 8 ++++--- .../_1c_syntax/bsl/parser/SDBLLexerTest.java | 21 +++++++++++++--- src/test/resources/sdbl/select07.sdbl | 2 ++ 4 files changed, 37 insertions(+), 18 deletions(-) create mode 100644 src/test/resources/sdbl/select07.sdbl diff --git a/src/main/antlr/SDBLLexer.g4 b/src/main/antlr/SDBLLexer.g4 index 64fb815e..eb109fa1 100644 --- a/src/main/antlr/SDBLLexer.g4 +++ b/src/main/antlr/SDBLLexer.g4 @@ -164,8 +164,8 @@ ENUM_TYPE: RU_P RU_E RU_R RU_E RU_CH RU_I RU_S RU_L RU_E RU_N RU_I RU_E EXCHANGE_PLAN_TYPE: PLAN_RU RU_O RU_B RU_M RU_E RU_N RU_A | E X C H A N G E P L A N; EXTERNAL_DATA_SOURCE_TYPE: - RU_V RU_N RU_E RU_SH RU_N RU_I RU_J RU_I RU_S RU_T RU_O RU_CH RU_N RU_I RU_K RU_D RU_A RU_N RU_N RU_Y RU_H - | E X T E R N A L D A T A S O U R C E; + (RU_V RU_N RU_E RU_SH RU_N RU_I RU_J RU_I RU_S RU_T RU_O RU_CH RU_N RU_I RU_K RU_D RU_A RU_N RU_N RU_Y RU_H + | E X T E R N A L D A T A S O U R C E) -> pushMode(EXTERNAL_DATA_SOURCE_MODE); FILTER_CRITERION_TYPE: RU_K RU_R RU_I RU_T RU_E RU_R RU_I RU_J RU_O RU_T RU_B RU_O RU_R RU_A | F I L T E R C R I T E R I O N; INFORMATION_REGISTER_TYPE: @@ -331,16 +331,6 @@ TASK_BY_PERFORMER_VT: | T A S K B Y P E R F O R M E R) -> popMode; TURNOVERS_VT: (TURNOVERS_RU | TURNOVERS_EN) -> popMode; -// external data source table -EXTERNAL_DATA_SOURCE_TABLE: (RU_T RU_A RU_B RU_L RU_I RU_C RU_A | T A B L E) -> popMode; - -// external data source cube -EXTERNAL_DATA_SOURCE_CUBE: (RU_K RU_U RU_B | C U B E) -> popMode; - -// external data source cube dimension table -EXTERNAL_DATA_SOURCE_CUBE_DIMTABLE: (RU_T RU_A RU_B RU_L RU_I RU_C RU_A RU_I RU_Z RU_M RU_E RU_R RU_E RU_N RU_I RU_YA - | D I M E N S I O N T A B L E) -> popMode; - DOT_IDENTIFIER : IDENTIFIER -> type(IDENTIFIER), popMode; mode BRACE_MODE; @@ -367,3 +357,13 @@ ID_TASK_TYPE : TASK_TYPE -> type(TASK_TYPE), popMode; ID_DOT : DOT -> type(DOT), pushMode(DOT_MODE), popMode; ID_IDENTIFIER : IDENTIFIER -> type(IDENTIFIER), popMode; ID_UNKNOWN : . -> channel(HIDDEN), type(UNKNOWN); + +mode EXTERNAL_DATA_SOURCE_MODE; +EDS_TABLE: (RU_T RU_A RU_B RU_L RU_I RU_C RU_A | T A B L E) -> popMode; +EDS_CUBE: (RU_K RU_U RU_B | C U B E); +EDS_CUBE_DIMTABLE: (RU_T RU_A RU_B RU_L RU_I RU_C RU_A RU_I RU_Z RU_M RU_E RU_R RU_E RU_N RU_I RU_YA + | D I M E N S I O N T A B L E) -> popMode; +EDS_WHITE_SPACE : WHITE_SPACE -> channel(HIDDEN), type(WHITE_SPACE); +EDS_MUL: MUL -> type(MUL); +EDS_DOT : DOT -> type(DOT); +EDS_IDENTIFIER : IDENTIFIER -> type(IDENTIFIER); diff --git a/src/main/antlr/SDBLParser.g4 b/src/main/antlr/SDBLParser.g4 index 85c85814..43cd4830 100644 --- a/src/main/antlr/SDBLParser.g4 +++ b/src/main/antlr/SDBLParser.g4 @@ -308,7 +308,7 @@ dataSources: tables+=dataSource (COMMA tables+=dataSource)*; dataSource: (LPAREN dataSource RPAREN) | (( - ((virtualTable | table | parameterTable) alias?) + ((virtualTable | table | parameterTable | externalDataSourceTable) alias?) | (LPAREN (virtualTable | table | parameterTable | subquery) RPAREN alias?) ) joins+=joinPart*) ; @@ -317,8 +317,6 @@ dataSource: table: mdo | mdo DOT objectTableName=identifier - | mdo DOT EXTERNAL_DATA_SOURCE_TABLE DOT externalTableName=identifier - | mdo DOT EXTERNAL_DATA_SOURCE_CUBE DOT externalTableCubeName=identifier DOT EXTERNAL_DATA_SOURCE_CUBE_DIMTABLE DOT externalTableName=identifier | tableName=identifier ; @@ -347,6 +345,10 @@ virtualTableParameter: logicalExpression?; // таблица как параметр, соединяться ни с чем не может parameterTable: parameter; +externalDataSourceTable: + mdo DOT EDS_TABLE DOT tableName=identifier + | mdo DOT EDS_CUBE DOT cubeName=identifier DOT EDS_CUBE_DIMTABLE DOT tableName=identifier; + // соединения таблиц joinPart: ( // тип соединения diff --git a/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLLexerTest.java b/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLLexerTest.java index 0f1b85cc..a4491a45 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLLexerTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLLexerTest.java @@ -180,8 +180,23 @@ void testMDOTT() { @Test void testExternalTypes() { - assertMatch(".Таблица", ".Table", SDBLLexer.DOT, SDBLLexer.EXTERNAL_DATA_SOURCE_TABLE); - assertMatch(".Куб", ".Cube", SDBLLexer.DOT, SDBLLexer.EXTERNAL_DATA_SOURCE_CUBE); - assertMatch(".ТаблицаИзмерения", ".DimensionTable", SDBLLexer.DOT, SDBLLexer.EXTERNAL_DATA_SOURCE_CUBE_DIMTABLE); + assertMatch("ВнешнийИсточникДанных.ВИД1.Таблица", + "ExternalDataSource.EDS1.Table", + SDBLLexer.EXTERNAL_DATA_SOURCE_TYPE, + SDBLLexer.DOT, + SDBLLexer.IDENTIFIER, + SDBLLexer.DOT, + SDBLLexer.EDS_TABLE); + assertMatch("ВнешнийИсточникДанных.ВИД1.Куб.Куб1.ТаблицаИзмерения", + "ExternalDataSource.EDS1.Cube.Cube1.DimensionTable", + SDBLLexer.EXTERNAL_DATA_SOURCE_TYPE, + SDBLLexer.DOT, + SDBLLexer.IDENTIFIER, + SDBLLexer.DOT, + SDBLLexer.EDS_CUBE, + SDBLLexer.DOT, + SDBLLexer.IDENTIFIER, + SDBLLexer.DOT, + SDBLLexer.EDS_CUBE_DIMTABLE); } } diff --git a/src/test/resources/sdbl/select07.sdbl b/src/test/resources/sdbl/select07.sdbl new file mode 100644 index 00000000..3ba9b0a1 --- /dev/null +++ b/src/test/resources/sdbl/select07.sdbl @@ -0,0 +1,2 @@ +ВЫБРАТЬ * +ИЗ РегистрСведений.Таблица КАК Таблица From 4521829c31db167cbb7cf2291604279fbd5893fe Mon Sep 17 00:00:00 2001 From: Dima Date: Sun, 4 Dec 2022 14:58:46 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=D0=B4=D0=BE=D0=BA=D0=B8=D0=BD=D1=83=D0=BB?= =?UTF-8?q?=20=D1=82=D0=B5=D1=81=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/github/_1c_syntax/bsl/parser/SDBLParserTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLParserTest.java b/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLParserTest.java index f871067a..7fabbd43 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLParserTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLParserTest.java @@ -308,6 +308,14 @@ void testSelect06() { ); } + @Test + void testSelect07() { + checkSource("src/test/resources/sdbl/select07.sdbl", + pair(SDBLParser.RULE_queries, 1), + pair(SDBLParser.RULE_dataSource, 1) + ); + } + private void checkSource(String filePath, Pair... rules) { var exampleString = TestUtils.getSourceFromFile(filePath); setInput(exampleString);