Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Добавление новых конструкций языка запросов и фиксы #247

Merged
merged 4 commits into from
Jul 31, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/qa.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ jobs:
- run: |
git fetch --prune --unshallow
- name: Set up JDK 11
uses: actions/setup-java@v3
uses: actions/setup-java@v3.12.0
with:
java-version: 11
distribution: 'adopt'
- name: SonarCloud Scan
run: ./gradlew check sonarqube
run: ./gradlew check sonar
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
2 changes: 2 additions & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
org.gradle.parallel=true
org.gradle.jvmargs=-Xmx1024m -XX:MaxMetaspaceSize=512m
32 changes: 32 additions & 0 deletions src/main/antlr/SDBLLexer.g4
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,13 @@ WHEN: RU_K RU_O RU_G RU_D RU_A
WHERE: RU_G RU_D RU_E | W H E R E;

// KEYWORDS RU EN
ACOS: A C O S;
ASIN: A S I N;
ATAN: A T A N;
AVG: RU_S RU_R RU_E RU_D RU_N RU_E RU_E | A V G;
BEGINOFPERIOD: RU_N RU_A RU_CH RU_A RU_L RU_O RU_P RU_E RU_R RU_I RU_O RU_D RU_A | B E G I N O F P E R I O D;
BOOLEAN: RU_B RU_U RU_L RU_E RU_V RU_O | B O O L E A N;
COS: C O S;
COUNT: RU_K RU_O RU_L RU_I RU_CH RU_E RU_S RU_T RU_V RU_O | C O U N T;
DATE: RU_D RU_A RU_T RU_A | D A T E;
DATEADD: RU_D RU_O RU_B RU_A RU_V RU_I RU_T RU_SOFT_SIGN RU_K RU_D RU_A RU_T RU_E | D A T E A D D;
Expand All @@ -110,8 +114,15 @@ DAYOFYEAR: RU_D RU_E RU_N RU_SOFT_SIGN RU_G RU_O RU_D RU_A
EMPTYTABLE: RU_P RU_U RU_S RU_T RU_A RU_YA RU_T RU_A RU_B RU_L RU_I RU_C RU_A | E M P T Y T A B L E;
EMPTYREF: RU_P RU_U RU_S RU_T RU_A RU_YA RU_S RU_S RU_Y RU_L RU_K RU_A | E M P T Y R E F;
ENDOFPERIOD: RU_K RU_O RU_N RU_E RU_C RU_P RU_E RU_R RU_I RU_O RU_D RU_A | E N D O F P E R I O D;
EXP: E X P;
// TODO найти англ вариант GROUPEDBY: RU_S RU_G RU_R RU_U RU_P RU_P RU_I RU_R RU_O RU_V RU_A RU_N RU_O RU_P RU_O | УТОНИЧТЬ;
HALFYEAR: RU_P RU_O RU_L RU_U RU_G RU_O RU_D RU_I RU_E | H A L F Y E A R;
HOUR: RU_CH RU_A RU_S | H O U R;
// TODO добавить метод лев без конфликта с левым соединением LEFT: RU_L RU_E RU_V | L E F T;
INT: RU_C RU_E RU_L | I N T;
LOG: L O G;
LOG10: L O G NUM_1 NUM_0;
LOWER: RU_N RU_R RU_E RU_G | L O W E R;
MAX: RU_M RU_A RU_K RU_S RU_I RU_M RU_U RU_M | M A X;
MIN: RU_M RU_I RU_N RU_I RU_M RU_U RU_M | M I N;
MINUTE: RU_M RU_I RU_N RU_U RU_T RU_A | M I N U T E;
Expand All @@ -127,17 +138,34 @@ RECORDAUTONUMBER:
REFPRESENTATION:
RU_P RU_R RU_E RU_D RU_S RU_T RU_A RU_V RU_L RU_E RU_N RU_I RU_E RU_S RU_S RU_Y RU_L RU_K RU_I
| R E F P R E S E N T A T I O N;
POW: P O W;
// TODO см Лев RIGHT: RU_P RU_R RU_A RU_V | R I G H T;
ROUND: RU_O RU_K RU_R | R O U N D;
SECOND: RU_S RU_E RU_K RU_U RU_N RU_D RU_A | S E C O N D;
SIN: S I N;
SQRT: S Q R T;
STOREDDATASIZE: RU_R RU_A RU_Z RU_M RU_E RU_R RU_H RU_R RU_A RU_N RU_I RU_M RU_Y RU_H RU_D RU_A RU_N RU_N RU_Y RU_H
| S T O R E D D A T A S I Z E;
STRING: RU_S RU_T RU_R RU_O RU_K RU_A | S T R I N G;
STRINGLENGTH: RU_D RU_L RU_I RU_N RU_A RU_S RU_T RU_R RU_O RU_K RU_I | S T R I N G L E N G T H;
STRFIND: RU_S RU_T RU_R RU_N RU_A RU_J RU_T RU_I | S T R F I N D;
STRREPLACE: RU_S RU_T RU_R RU_Z RU_A RU_M RU_E RU_N RU_I RU_T RU_SOFT_SIGN | S T R R E P L A C E;
SUBSTRING: RU_P RU_O RU_D RU_S RU_T RU_R RU_O RU_K RU_A | S U B S T R I N G;
SUM: RU_S RU_U RU_M RU_M RU_A | S U M;
TAN: T A N;
TENDAYS: RU_D RU_E RU_K RU_A RU_D RU_A | T E N D A Y S;
TRIMALL: RU_S RU_O RU_K RU_R RU_L RU_P | T R I M A L L;
TRIML: RU_S RU_O RU_K RU_R RU_L | T R I M L;
TRIMR: RU_S RU_O RU_K RU_R RU_P | T R I M R;
TYPE: RU_T RU_I RU_P | T Y P E;
UPPER: RU_V RU_R RU_E RU_G | U P P E R;
VALUE: RU_Z RU_N RU_A RU_CH RU_E RU_N RU_I RU_E | V A L U E;
VALUETYPE: RU_T RU_I RU_P RU_Z RU_N RU_A RU_CH RU_E RU_N RU_I RU_YA | V A L U E T Y P E;
WEEK: RU_N RU_E RU_D RU_E RU_L RU_YA | W E E K;
WEEKDAY: RU_D RU_E RU_N RU_SOFT_SIGN RU_N RU_E RU_D RU_E RU_L RU_I | W E E K D A Y;
YEAR: RU_G RU_O RU_D | Y E A R;
UUID: RU_U RU_N RU_I RU_K RU_A RU_L RU_SOFT_SIGN RU_N RU_Y RU_J RU_I RU_D RU_E RU_N RU_T RU_I RU_F RU_I RU_K RU_A RU_T RU_O RU_R
| U U I D;

// MDO TYPES RU EN
ACCOUNTING_REGISTER_TYPE:
Expand Down Expand Up @@ -277,6 +305,10 @@ fragment H: 'H' | 'h';
fragment W: 'W' | 'w';
fragment X: 'X' | 'x';
fragment Y: 'Y' | 'y';
fragment Z: 'Z' | 'z';

fragment NUM_0: '0';
fragment NUM_1: '1';

// LITERALS
fragment DIGIT: [0-9];
Expand Down
44 changes: 44 additions & 0 deletions src/main/antlr/SDBLParser.g4
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,12 @@ builtInFunctions:
| (doCall=DATEDIFF LPAREN firstdate=expression COMMA seconddate=expression COMMA periodType=(SECOND | MINUTE | HOUR | DAY | MONTH | QUARTER | YEAR) RPAREN)
| (doCall=(VALUETYPE | PRESENTATION | REFPRESENTATION | GROUPEDBY) LPAREN value=expression RPAREN)
| (doCall=ISNULL LPAREN first=logicalExpression COMMA second=logicalExpression RPAREN)
| (doCall=(ACOS | ASIN | ATAN | COS | SIN | TAN | LOG | LOG10 | EXP | POW | SQRT | INT) LPAREN decimal=expression RPAREN)
| (doCall=(LOWER | STRINGLENGTH | TRIMALL | TRIML | TRIMR | UPPER) LPAREN string=expression RPAREN)
| (doCall=ROUND LPAREN decimal=expression COMMA precise=expression RPAREN)
| (doCall=(STOREDDATASIZE | UUID) LPAREN value=expression RPAREN)
| (doCall=STRFIND LPAREN string=expression COMMA substring1=expression RPAREN)
| (doCall=STRREPLACE LPAREN string=expression COMMA substring1=expression COMMA substring1=expression RPAREN)
;

// агрегатные ф-ии
Expand Down Expand Up @@ -279,6 +285,7 @@ logicalExpression:
condidions+=predicate
((AND | OR) condidions+=predicate)*
;

predicate: NOT* (
booleanPredicate=expression // булево
| likePredicate
Expand Down Expand Up @@ -457,6 +464,43 @@ identifier:
| WEEK
| WEEKDAY
| YEAR
| ORDER
| GROUP
| INDEX
| SET
| RIGHT
| LEFT
| INNER
| FULL
| JOIN
| OUTER
| FOR
| UPDATE
| ALL
| UNION
| ACOS
| ASIN
| ATAN
| COS
| SIN
| TAN
| LOG
| LOG10
| EXP
| POW
| SQRT
| INT
| LOWER
| STRINGLENGTH
| TRIMALL
| TRIML
| TRIMR
| UPPER
| ROUND
| STOREDDATASIZE
| UUID
| STRFIND
| STRREPLACE
;

// параметр запроса
Expand Down
27 changes: 27 additions & 0 deletions src/test/java/com/github/_1c_syntax/bsl/parser/SDBLLexerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,33 @@ void testKeyWords() {

}

@Test
void testKeyWordsP2() {
assertMatch("ЦЕЛ", "int", SDBLLexer.INT);
assertMatch("ACOS", "ACOs", SDBLLexer.ACOS);
assertMatch("ASIN", "ASIn", SDBLLexer.ASIN);
assertMatch("ATAN", "ATaN", SDBLLexer.ATAN);
assertMatch("COS", "cOS", SDBLLexer.COS);
assertMatch("SIN", "SiN", SDBLLexer.SIN);
assertMatch("TAN", "TAn", SDBLLexer.TAN);
assertMatch("LOG", "LOg", SDBLLexer.LOG);
assertMatch("LOG10", "loG10", SDBLLexer.LOG10);
assertMatch("EXP", "EXp", SDBLLexer.EXP);
assertMatch("POW", "POw", SDBLLexer.POW);
assertMatch("SQRT", "SqRT", SDBLLexer.SQRT);
assertMatch("LOWER", "Нрег", SDBLLexer.LOWER);
assertMatch("STRINGLENGTH", "ДлинаСТроки", SDBLLexer.STRINGLENGTH);
assertMatch("TRIMALL", "Сокрлп", SDBLLexer.TRIMALL);
assertMatch("TRIML", "Сокрл", SDBLLexer.TRIML);
assertMatch("TRIMR", "СокрП", SDBLLexer.TRIMR);
assertMatch("UPPER", "вреГ", SDBLLexer.UPPER);
assertMatch("ROUND", "окр", SDBLLexer.ROUND);
assertMatch("STOREDDATASIZE", "РазмерХранимыхДанных", SDBLLexer.STOREDDATASIZE);
assertMatch("UUID", "УникальныйиДентификатор", SDBLLexer.UUID);
assertMatch("STRFIND", "стрнайТи", SDBLLexer.STRFIND);
assertMatch("STRREPLACE", "стрЗАМЕнить", SDBLLexer.STRREPLACE);
}

@Test
void testStandardFields() {
assertMatch("ТочкаМаршрута", "RoutePoint", SDBLLexer.ROUTEPOINT_FIELD);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,15 @@ void testSelect07() {
);
}

@Test
void testSelect08() {
checkSource("src/test/resources/sdbl/select08.sdbl",
pair(SDBLParser.RULE_queries, 1),
pair(SDBLParser.RULE_dataSource, 1),
pair(SDBLParser.RULE_builtInFunctions, 35)
);
}

private void checkSource(String filePath, Pair... rules) {
var exampleString = TestUtils.getSourceFromFile(filePath);
setInput(exampleString);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import org.antlr.v4.runtime.Lexer;
import org.antlr.v4.runtime.Token;
import org.junit.jupiter.api.Test;
import utils.TestUtils;

import java.util.List;

Expand Down Expand Up @@ -62,5 +63,4 @@ void computeAST() {
assertThat(query.getStart().getType()).isEqualTo(SDBLParser.SELECT);
assertThat(query.getStop().getType()).isEqualTo(SDBLParser.IDENTIFIER);
}

}
37 changes: 37 additions & 0 deletions src/test/resources/sdbl/select08.sdbl
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
ВЫБРАТЬ
ЦЕЛ(СРЕДНЕЕ(Таблица.Поле)) КАК Цел,
INT(СРЕДНЕЕ(Таблица.Поле)) КАК INT,
ACOS(Таблица.Поле) КАК ACOS,
ASIN(Таблица.Поле) КАК ASIN,
ATAN(Таблица.Поле) КАК ATAN,
COS(Таблица.Поле) КАК COS,
SIN(Таблица.Поле) КАК SIN,
TAN(Таблица.Поле) КАК TAN,
LOG(Таблица.Поле) КАК LOG,
LOG10(Таблица.Поле) КАК LOG10,
EXP(Таблица.Поле) КАК EXP,
POW(Таблица.Поле) КАК POW,
SQRT(Таблица.Поле) КАК SQRT,
LOWER(Таблица.Поле) КАК LOWER,
НРЕГ(Таблица.Поле) КАК НРЕГ,
STRINGLENGTH(Таблица.Поле) КАК STRINGLENGTH,
ДЛИНАСТРОКИ(Таблица.Поле) КАК СТРДЛИНА,
TRIMALL(Таблица.Поле) КАК TRIMALL,
СОКРЛП(Таблица.Поле) КАК СОКРЛП,
TRIML(Таблица.Поле) КАК TRIML,
СОКРЛ(Таблица.Поле) КАК СОКРЛ,
TRIMR(Таблица.Поле) КАК TRIMR,
СОКРП(Таблица.Поле) КАК СОКРП,
UPPER(Таблица.Поле) КАК UPPER,
ВРЕГ(Таблица.Поле) КАК ВРЕГ,
ROUND(Таблица.Поле, Таблица.Поле2) КАК ROUND,
ОКР(Таблица.Поле, Таблица.Поле2) КАК ОКР,
STOREDDATASIZE(Таблица.Поле) КАК STOREDDATASIZE,
РазмерХранимыхДанных(Таблица.Поле) КАК РазмерХранимыхДанных,
UUID(Таблица.Поле) КАК UUID,
УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Таблица.Поле) КАК УНИКАЛЬНЫЙИДЕНТИФИКАТОР,
STRFIND(Таблица.Поле, Таблица.Поле2) КАК STRFIND,
СтрНайти(Таблица.Поле, Таблица.Поле2) КАК СтрНайти,
STRREPLACE(Таблица.Поле, Таблица.Поле2, Таблица.Поле3) КАК STRREPLACE,
СтрЗаменить(Таблица.Поле, Таблица.Поле2, Таблица.Поле3) КАК СтрЗаменить
ИЗ РегистрСведений.Таблица КАК Таблица