Skip to content

Commit 8f73f30

Browse files
authored
Merge pull request #3655 from ovcharenko-di/fix/query-missing-eds-cubes
Исправления ошибок, рефакторинг QueryToMissingMetadataDiagnostic
2 parents 9edc889 + b459fb6 commit 8f73f30

File tree

6 files changed

+195
-23
lines changed

6 files changed

+195
-23
lines changed

src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryToMissingMetadataDiagnostic.java

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticSeverity;
2727
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag;
2828
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType;
29+
import com.github._1c_syntax.bsl.mdo.ExternalDataSource;
2930
import com.github._1c_syntax.bsl.mdo.MD;
3031
import com.github._1c_syntax.bsl.mdo.children.ExternalDataSourceCube;
3132
import com.github._1c_syntax.bsl.mdo.children.ExternalDataSourceCubeDimensionTable;
@@ -73,6 +74,7 @@ public ParseTree visitDataSources(SDBLParser.DataSourcesContext ctx) {
7374
.map(SDBLParser.DataSourceContext::externalDataSourceTable)
7475
.filter(Objects::nonNull)
7576
.filter(eds -> eds.cubeName != null)
77+
.filter(eds -> eds.mdo() != null && eds.mdo().tableName != null)
7678
.forEach(eds -> {
7779
if (nonCubeExists(eds)) {
7880
diagnosticStorage.addDiagnostic(eds.cubeName, info.getMessage(eds.cubeName.getText()));
@@ -106,30 +108,38 @@ private Optional<MD> getMdo(String mdoTypeName, String mdoName) {
106108
&& mdoName.equalsIgnoreCase(mdo.getName())));
107109
}
108110

111+
/**
112+
* Returns the external data source with the given name, case-insensitive.
113+
*/
114+
private Optional<ExternalDataSource> getExternalDataSource(String name) {
115+
return documentContext.getServerContext().getConfiguration().getExternalDataSources()
116+
.stream()
117+
.filter(mdo -> name.equalsIgnoreCase(mdo.getName()))
118+
.findFirst();
119+
}
120+
109121
private Optional<ExternalDataSourceCube> getCube(SDBLParser.ExternalDataSourceTableContext eds) {
110122

111123
var mdoName = eds.mdo().tableName.getText();
112124
var cubeName = eds.cubeName.getText();
113125

114-
return documentContext.getServerContext().getConfiguration().getExternalDataSources()
115-
.stream()
116-
.filter(mdo -> mdoName.equalsIgnoreCase(mdo.getName()))
117-
.flatMap(mdo -> mdo.getCubes().stream())
126+
return getExternalDataSource(mdoName)
127+
.flatMap(mdo -> mdo.getCubes().stream()
118128
.filter(cube -> cubeName.equalsIgnoreCase(cube.getName()))
119-
.findFirst();
129+
.findFirst());
120130
}
121131

122132
private Optional<ExternalDataSourceCubeDimensionTable> getCubeDimTable(SDBLParser.ExternalDataSourceTableContext eds) {
123133

124134
var mdoName = eds.mdo().tableName.getText();
135+
var cubeName = eds.cubeName.getText();
125136
var cubeDimTableName = eds.tableName.getText();
126137

127-
return documentContext.getServerContext().getConfiguration().getExternalDataSources()
128-
.stream()
129-
.filter(mdo -> mdoName.equalsIgnoreCase(mdo.getName()))
138+
return getExternalDataSource(mdoName)
130139
.flatMap(mdo -> mdo.getCubes().stream()
131-
.flatMap(c -> c.getDimensionTables().stream()))
132-
.filter(table -> cubeDimTableName.equalsIgnoreCase(table.getName()))
133-
.findFirst();
140+
.filter(cube -> cubeName.equalsIgnoreCase(cube.getName()))
141+
.flatMap(c -> c.getDimensionTables().stream())
142+
.filter(table -> cubeDimTableName.equalsIgnoreCase(table.getName()))
143+
.findFirst());
134144
}
135145
}

src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryToMissingMetadataDiagnosticTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,12 @@ void test() {
5555
66, 18, 62)
5656
.hasMessageOnRange("Исправьте обращение к несуществующему метаданному \"Куб2\" в запросе",
5757
80, 51, 55)
58+
.hasMessageOnRange("Исправьте обращение к несуществующему метаданному \"ТаблицаИзмерения1\" в запросе",
59+
80, 73, 90)
5860
.hasMessageOnRange("Исправьте обращение к несуществующему метаданному \"ТаблицаИзмерения2\" в запросе",
5961
94, 73, 90)
6062

61-
.hasSize(6);
63+
.hasSize(7);
6264

6365
}
6466

src/test/resources/diagnostics/QueryToMissingMetadataDiagnostic.bsl

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@
7676

7777
Запрос6 = Новый Запрос;
7878
Запрос6.Текст = "ВЫБРАТЬ
79-
| Куб1ТаблицаИзмеренияТаблицаИзмерения1.Поле1 КАК Поле1
79+
| Куб2ТаблицаИзмеренияТаблицаИзмерения1.Поле1 КАК Поле1
8080
|ИЗ
81-
| ВнешнийИсточникДанных.ВнешнийИсточникДанных1.Куб.Куб2.ТаблицаИзмерения.ТаблицаИзмерения1 КАК Куб1ТаблицаИзмеренияТаблицаИзмерения1"; // ошибка Куб2
81+
| ВнешнийИсточникДанных.ВнешнийИсточникДанных1.Куб.Куб2.ТаблицаИзмерения.ТаблицаИзмерения1 КАК Куб2ТаблицаИзмеренияТаблицаИзмерения1"; // ошибка Куб2, ошибка ТаблицаИзмерения1
8282
Запрос6.Выполнить();
8383

8484
Запрос7 = Новый Запрос;
@@ -97,14 +97,7 @@
9797

9898
Запрос9 = Новый Запрос;
9999
Запрос9.Текст = "ВЫБРАТЬ
100-
| Куб1.Измерение1 КАК Измерение1 // не ошибка
100+
| Куб3ТаблицаИзмеренияТаблицаИзмерения2.Поле1 КАК Поле1
101101
|ИЗ
102-
| ВнешнийИсточникДанных.ВнешнийИсточникДанных1.Куб.Куб1 КАК Куб1";
102+
| ВнешнийИсточникДанных.ВнешнийИсточникДанных1.Куб.Куб3.ТаблицаИзмерения.ТаблицаИзмерения2 КАК Куб3ТаблицаИзмеренияТаблицаИзмерения2"; // не ошибка
103103
Запрос9.Выполнить();
104-
105-
Запрос10 = Новый Запрос;
106-
Запрос10.Текст = "ВЫБРАТЬ
107-
| Куб1.Измерение1 КАК Измерение2 // ошибка Измерение2
108-
|ИЗ
109-
| ВнешнийИсточникДанных.ВнешнийИсточникДанных1.Куб.Куб1 КАК Куб1";
110-
Запрос10.Выполнить();

src/test/resources/metadata/designer/ExternalDataSources/ВнешнийИсточникДанных1.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
<ChildObjects>
2525
<Table>Таблица1</Table>
2626
<Cube>Куб1</Cube>
27+
<Cube>Куб3</Cube>
2728
</ChildObjects>
2829
</ExternalDataSource>
2930
</MetaDataObject>
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.11">
3+
<Cube uuid="d097446c-5961-4e05-a5b1-dd2b3b1e51e6">
4+
<InternalInfo>
5+
<xr:GeneratedType name="ExternalDataSourceCubeManager.ВнешнийИсточникДанных1.Куб3" category="Manager">
6+
<xr:TypeId>91a00b63-44b7-4610-b504-15c593d8c4ee</xr:TypeId>
7+
<xr:ValueId>c4c0d63d-b7cb-4c48-ad16-5d626a7dbef7</xr:ValueId>
8+
</xr:GeneratedType>
9+
<xr:GeneratedType name="ExternalDataSourceCubeList.ВнешнийИсточникДанных1.Куб3" category="List">
10+
<xr:TypeId>11f58724-3236-464a-8b8b-174041fe47ad</xr:TypeId>
11+
<xr:ValueId>b42039ba-d5be-4023-9db9-79622775a94a</xr:ValueId>
12+
</xr:GeneratedType>
13+
<xr:GeneratedType name="ExternalDataSourceCubeRecordSet.ВнешнийИсточникДанных1.Куб3" category="RecordSet">
14+
<xr:TypeId>ddd5555b-0521-4d92-8741-09933ae054c3</xr:TypeId>
15+
<xr:ValueId>b4c4f887-a431-4ba6-bdb0-8ec281440967</xr:ValueId>
16+
</xr:GeneratedType>
17+
<xr:GeneratedType name="ExternalDataSourceCubeRecordKey.ВнешнийИсточникДанных1.Куб3" category="RecordKey">
18+
<xr:TypeId>d3881e3d-943d-449b-a2b7-97068d4fdc3d</xr:TypeId>
19+
<xr:ValueId>b94e5d2b-b198-425f-ae23-30641d396519</xr:ValueId>
20+
</xr:GeneratedType>
21+
<xr:GeneratedType name="ExternalDataSourceCubeRecordManager.ВнешнийИсточникДанных1.Куб3" category="RecordManager">
22+
<xr:TypeId>07861d3e-a9bd-46a7-b773-a0680de924d0</xr:TypeId>
23+
<xr:ValueId>5d379885-a7f4-438d-82a6-2c206bd96053</xr:ValueId>
24+
</xr:GeneratedType>
25+
<xr:GeneratedType name="ExternalDataSourceCubeDimensionsTablesManager.ВнешнийИсточникДанных1.Куб3" category="DimensionTables">
26+
<xr:TypeId>f56756f4-d0f0-42b4-ac23-b9d4625ce362</xr:TypeId>
27+
<xr:ValueId>db51a42e-9193-4243-9326-13c578b289cd</xr:ValueId>
28+
</xr:GeneratedType>
29+
</InternalInfo>
30+
<Properties>
31+
<Name>Куб3</Name>
32+
<Synonym/>
33+
<Comment/>
34+
<NameInDataSource/>
35+
<Characteristics/>
36+
<UseStandardCommands>false</UseStandardCommands>
37+
<DefaultRecordForm/>
38+
<DefaultListForm/>
39+
<RecordPresentation/>
40+
<ExtendedRecordPresentation/>
41+
<ListPresentation/>
42+
<ExtendedListPresentation/>
43+
<Explanation/>
44+
<IncludeHelpInContents>false</IncludeHelpInContents>
45+
</Properties>
46+
<ChildObjects>
47+
<DimensionTable>ТаблицаИзмерения2</DimensionTable>
48+
<Dimension uuid="c235f687-f120-414f-a502-ec0d6986d091">
49+
<Properties>
50+
<Name>Измерение1</Name>
51+
<Synonym/>
52+
<Comment/>
53+
<Type>
54+
<v8:Type>xs:string</v8:Type>
55+
<v8:StringQualifiers>
56+
<v8:Length>10</v8:Length>
57+
<v8:AllowedLength>Variable</v8:AllowedLength>
58+
</v8:StringQualifiers>
59+
</Type>
60+
<PasswordMode>false</PasswordMode>
61+
<Format/>
62+
<EditFormat/>
63+
<ToolTip/>
64+
<MarkNegatives>false</MarkNegatives>
65+
<Mask/>
66+
<MultiLine>false</MultiLine>
67+
<ExtendedEdit>false</ExtendedEdit>
68+
<MinValue xsi:nil="true"/>
69+
<MaxValue xsi:nil="true"/>
70+
<FillChecking>DontCheck</FillChecking>
71+
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
72+
<ChoiceParameterLinks/>
73+
<ChoiceParameters/>
74+
<QuickChoice>Auto</QuickChoice>
75+
<CreateOnInput>Auto</CreateOnInput>
76+
<ChoiceForm/>
77+
<LinkByType/>
78+
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
79+
</Properties>
80+
</Dimension>
81+
</ChildObjects>
82+
</Cube>
83+
</MetaDataObject>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.11">
3+
<DimensionTable uuid="75a20b42-1f61-4f58-ab49-a158925e63ba">
4+
<InternalInfo>
5+
<xr:GeneratedType name="ExternalDataSourceCubeDimensionTableManager.ВнешнийИсточникДанных1.Куб3.ТаблицаИзмерения2" category="Manager">
6+
<xr:TypeId>4e33c017-02a6-47a9-b190-db8cbd65cf8d</xr:TypeId>
7+
<xr:ValueId>70e9413e-e493-410e-8795-2928540a7ecb</xr:ValueId>
8+
</xr:GeneratedType>
9+
<xr:GeneratedType name="ExternalDataSourceCubeDimensionTableObject.ВнешнийИсточникДанных1.Куб3.ТаблицаИзмерения2" category="Object">
10+
<xr:TypeId>906eff59-3cfe-4920-8ed5-07a3d0232e99</xr:TypeId>
11+
<xr:ValueId>bc19facd-8a3d-44ef-9283-8fdcbe4e1114</xr:ValueId>
12+
</xr:GeneratedType>
13+
<xr:GeneratedType name="ExternalDataSourceCubeDimensionTableRef.ВнешнийИсточникДанных1.Куб3.ТаблицаИзмерения2" category="Ref">
14+
<xr:TypeId>4a17e893-dbff-43bf-bd8b-6977e0d9cbed</xr:TypeId>
15+
<xr:ValueId>4de2d3ae-7a29-45fc-8dac-63655ebdc769</xr:ValueId>
16+
</xr:GeneratedType>
17+
<xr:GeneratedType name="ExternalDataSourceCubeDimensionTableList.ВнешнийИсточникДанных1.Куб3.ТаблицаИзмерения2" category="List">
18+
<xr:TypeId>093e1073-e6be-4020-bb80-230cafeca673</xr:TypeId>
19+
<xr:ValueId>955aab6c-0cef-465c-a4b2-2247d5b07d6e</xr:ValueId>
20+
</xr:GeneratedType>
21+
</InternalInfo>
22+
<Properties>
23+
<Name>ТаблицаИзмерения2</Name>
24+
<Synonym/>
25+
<Comment/>
26+
<NameInDataSource/>
27+
<PresentationField/>
28+
<HierarchyNameInDataSource/>
29+
<LevelNumber>0</LevelNumber>
30+
<Hierarchical>false</Hierarchical>
31+
<UnfilledParentValue xsi:nil="true"/>
32+
<UseStandardCommands>false</UseStandardCommands>
33+
<QuickChoice>false</QuickChoice>
34+
<DefaultObjectForm/>
35+
<DefaultListForm/>
36+
<DefaultChoiceForm/>
37+
<ObjectPresentation/>
38+
<ExtendedObjectPresentation/>
39+
<ListPresentation/>
40+
<ExtendedListPresentation/>
41+
<Explanation/>
42+
<IncludeHelpInContents>false</IncludeHelpInContents>
43+
</Properties>
44+
<ChildObjects>
45+
<Field uuid="cb66ceb2-9970-4136-a185-3eee0b39a533">
46+
<Properties>
47+
<Name>Поле1</Name>
48+
<Synonym/>
49+
<Comment/>
50+
<Type>
51+
<v8:Type>xs:string</v8:Type>
52+
<v8:StringQualifiers>
53+
<v8:Length>10</v8:Length>
54+
<v8:AllowedLength>Variable</v8:AllowedLength>
55+
</v8:StringQualifiers>
56+
</Type>
57+
<PasswordMode>false</PasswordMode>
58+
<Format/>
59+
<EditFormat/>
60+
<ToolTip/>
61+
<MarkNegatives>false</MarkNegatives>
62+
<Mask/>
63+
<MultiLine>false</MultiLine>
64+
<ExtendedEdit>false</ExtendedEdit>
65+
<MinValue xsi:nil="true"/>
66+
<MaxValue xsi:nil="true"/>
67+
<FillFromFillingValue>false</FillFromFillingValue>
68+
<FillValue xsi:type="xs:string"/>
69+
<FillChecking>DontCheck</FillChecking>
70+
<ChoiceParameterLinks/>
71+
<ChoiceParameters/>
72+
<QuickChoice>Auto</QuickChoice>
73+
<CreateOnInput>Auto</CreateOnInput>
74+
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
75+
<ChoiceForm/>
76+
<NameInDataSource/>
77+
<ReadOnly>false</ReadOnly>
78+
<AllowNull>true</AllowNull>
79+
</Properties>
80+
</Field>
81+
</ChildObjects>
82+
</DimensionTable>
83+
</MetaDataObject>

0 commit comments

Comments
 (0)