Skip to content

Commit 1373172

Browse files
committed
update addSource() interface
Signed-off-by: Peng Huo <[email protected]>
1 parent 457b2e2 commit 1373172

File tree

8 files changed

+63
-89
lines changed

8 files changed

+63
-89
lines changed

core/src/main/java/org/opensearch/sql/datasource/DataSourceService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ public interface DataSourceService {
3232
/**
3333
* Register {@link DataSource} defined by {@link DataSourceMetadata}.
3434
*
35-
* @param dataSourceMetadata {@link DataSourceMetadata}.
35+
* @param metadatas list of {@link DataSourceMetadata}.
3636
*/
37-
void addDataSource(DataSourceMetadata dataSourceMetadata);
37+
void addDataSource(DataSourceMetadata... metadatas);
3838

3939
/**
4040
* remove all the registered {@link DataSource}.

core/src/main/java/org/opensearch/sql/datasource/DataSourceServiceImpl.java

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55

66
package org.opensearch.sql.datasource;
77

8+
import com.google.common.base.Preconditions;
9+
import com.google.common.base.Strings;
810
import java.util.HashSet;
911
import java.util.Map;
1012
import java.util.Objects;
1113
import java.util.Set;
1214
import java.util.concurrent.ConcurrentHashMap;
1315
import java.util.stream.Collectors;
14-
import org.apache.commons.lang3.StringUtils;
16+
import org.opensearch.sql.common.utils.StringUtils;
1517
import org.opensearch.sql.datasource.model.DataSource;
1618
import org.opensearch.sql.datasource.model.DataSourceMetadata;
1719
import org.opensearch.sql.datasource.model.DataSourceType;
@@ -58,11 +60,13 @@ public DataSource getDataSource(String dataSourceName) {
5860
}
5961

6062
@Override
61-
public void addDataSource(DataSourceMetadata metadata) {
62-
validateDataSource(metadata);
63-
dataSourceMap.put(
64-
metadata.getName(),
65-
dataSourceFactoryMap.get(metadata.getConnector()).createDataSource(metadata));
63+
public void addDataSource(DataSourceMetadata... metadatas) {
64+
for (DataSourceMetadata metadata : metadatas) {
65+
validateDataSourceMetaData(metadata);
66+
dataSourceMap.put(
67+
metadata.getName(),
68+
dataSourceFactoryMap.get(metadata.getConnector()).createDataSource(metadata));
69+
}
6670
}
6771

6872
@Override
@@ -75,20 +79,22 @@ public void clear() {
7579
*
7680
* @param metadata {@link DataSourceMetadata}.
7781
*/
78-
private void validateDataSource(DataSourceMetadata metadata) {
79-
if (StringUtils.isEmpty(metadata.getName())) {
80-
throw new IllegalArgumentException(
81-
"Missing Name Field from a DataSource. Name is a required parameter.");
82-
}
83-
if (!metadata.getName().matches(DATASOURCE_NAME_REGEX)) {
84-
throw new IllegalArgumentException(
85-
String.format(
86-
"DataSource Name: %s contains illegal characters. Allowed characters: a-zA-Z0-9_-*@.",
87-
metadata.getName()));
88-
}
89-
if (Objects.isNull(metadata.getProperties())) {
90-
throw new IllegalArgumentException(
91-
"Missing properties field in catalog configuration. Properties are required parameters.");
92-
}
82+
private void validateDataSourceMetaData(DataSourceMetadata metadata) {
83+
Preconditions.checkArgument(
84+
!Strings.isNullOrEmpty(metadata.getName()),
85+
"Missing Name Field from a DataSource. Name is a required parameter.");
86+
Preconditions.checkArgument(
87+
!dataSourceMap.containsKey(metadata.getName()),
88+
StringUtils.format(
89+
"Datasource name should be unique, Duplicate datasource found %s.",
90+
metadata.getName()));
91+
Preconditions.checkArgument(
92+
metadata.getName().matches(DATASOURCE_NAME_REGEX),
93+
StringUtils.format(
94+
"DataSource Name: %s contains illegal characters. Allowed characters: a-zA-Z0-9_-*@.",
95+
metadata.getName()));
96+
Preconditions.checkArgument(
97+
!Objects.isNull(metadata.getProperties()),
98+
"Missing properties field in catalog configuration. Properties are required parameters.");
9399
}
94100
}

core/src/test/java/org/opensearch/sql/analysis/AnalyzerTestBase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ public DataSource getDataSource(String dataSourceName) {
207207
}
208208

209209
@Override
210-
public void addDataSource(DataSourceMetadata metadata) {
210+
public void addDataSource(DataSourceMetadata... metadatas) {
211211
throw new UnsupportedOperationException();
212212
}
213213

core/src/test/java/org/opensearch/sql/catalog/DataSourceServiceImplTest.java renamed to core/src/test/java/org/opensearch/sql/datasource/DataSourceServiceImplTest.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package org.opensearch.sql.catalog;
6+
package org.opensearch.sql.datasource;
77

88
import static org.junit.jupiter.api.Assertions.assertEquals;
99
import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -15,13 +15,12 @@
1515
import com.google.common.collect.ImmutableMap;
1616
import java.util.HashSet;
1717
import java.util.Map;
18+
import org.junit.jupiter.api.AfterEach;
1819
import org.junit.jupiter.api.BeforeEach;
1920
import org.junit.jupiter.api.Test;
2021
import org.junit.jupiter.api.extension.ExtendWith;
2122
import org.mockito.Mock;
2223
import org.mockito.junit.jupiter.MockitoExtension;
23-
import org.opensearch.sql.datasource.DataSourceService;
24-
import org.opensearch.sql.datasource.DataSourceServiceImpl;
2524
import org.opensearch.sql.datasource.model.DataSource;
2625
import org.opensearch.sql.datasource.model.DataSourceMetadata;
2726
import org.opensearch.sql.datasource.model.DataSourceType;
@@ -59,6 +58,11 @@ public void setup() {
5958
});
6059
}
6160

61+
@AfterEach
62+
public void clear() {
63+
dataSourceService.clear();
64+
}
65+
6266
@Test
6367
void getDataSourceSuccess() {
6468
dataSourceService.addDataSource(DataSourceMetadata.defaultOpenSearchDataSourceMetadata());
@@ -130,6 +134,20 @@ void metaDataMissingPropertiesShouldFail() {
130134
exception.getMessage());
131135
}
132136

137+
@Test
138+
void metaDataHasDuplicateNameShouldFail() {
139+
dataSourceService.addDataSource(metadata(NAME, DataSourceType.OPENSEARCH, ImmutableMap.of()));
140+
assertEquals(1, dataSourceService.getDataSources().size());
141+
142+
IllegalArgumentException exception =
143+
assertThrows(
144+
IllegalArgumentException.class,
145+
() -> dataSourceService.addDataSource(metadata(NAME, DataSourceType.OPENSEARCH, null)));
146+
assertEquals(
147+
String.format("Datasource name should be unique, Duplicate datasource found %s.", NAME),
148+
exception.getMessage());
149+
}
150+
133151
DataSourceMetadata metadata(String name, DataSourceType type, Map<String, String> properties) {
134152
DataSourceMetadata dataSourceMetadata = new DataSourceMetadata();
135153
dataSourceMetadata.setName(name);

core/src/test/java/org/opensearch/sql/catalog/model/auth/AuthenticationTypeTest.java renamed to core/src/test/java/org/opensearch/sql/datasource/model/auth/AuthenticationTypeTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package org.opensearch.sql.catalog.model.auth;
6+
package org.opensearch.sql.datasource.model.auth;
77

88

99
import static org.junit.jupiter.api.Assertions.assertEquals;
1010
import static org.junit.jupiter.api.Assertions.assertNull;
1111

1212
import org.junit.jupiter.api.Test;
13-
import org.opensearch.sql.datasource.model.auth.AuthenticationType;
1413

1514
class AuthenticationTypeTest {
1615
@Test

plugin/src/main/java/org/opensearch/sql/plugin/SQLPlugin.java

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,8 @@
1818
import java.util.Arrays;
1919
import java.util.Collection;
2020
import java.util.Collections;
21-
import java.util.HashSet;
2221
import java.util.List;
23-
import java.util.Locale;
2422
import java.util.Objects;
25-
import java.util.Set;
2623
import java.util.function.Supplier;
2724
import org.apache.logging.log4j.LogManager;
2825
import org.apache.logging.log4j.Logger;
@@ -242,8 +239,7 @@ public static void loadDataSources(DataSourceService dataSourceService, Settings
242239
try {
243240
List<DataSourceMetadata> metadataList =
244241
objectMapper.readValue(inputStream, new TypeReference<>() {});
245-
verifyDuplicateName(metadataList);
246-
metadataList.forEach(metadata -> dataSourceService.addDataSource(metadata));
242+
dataSourceService.addDataSource(metadataList.toArray(new DataSourceMetadata[0]));
247243
} catch (IOException e) {
248244
LOG.error(
249245
"DataSource Configuration File uploaded is malformed. Verify and re-upload.", e);
@@ -254,18 +250,4 @@ public static void loadDataSources(DataSourceService dataSourceService, Settings
254250
return null;
255251
});
256252
}
257-
258-
static void verifyDuplicateName(List<DataSourceMetadata> metadataList) {
259-
Set<String> seenNames = new HashSet<>();
260-
for (DataSourceMetadata metadata : metadataList) {
261-
if (seenNames.contains(metadata.getName())) {
262-
throw new IllegalArgumentException(
263-
String.format(
264-
Locale.ROOT,
265-
"Datasource name should be unique, Duplicate datasource found %s",
266-
metadata.getName()));
267-
}
268-
seenNames.add(metadata.getName());
269-
}
270-
}
271253
}

plugin/src/test/java/org/opensearch/sql/plugin/datasource/DataSourceServiceImplTest.java renamed to plugin/src/test/java/org/opensearch/sql/plugin/datasource/DataSourceMetaDataTest.java

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@
3434
import org.opensearch.sql.plugin.SQLPlugin;
3535

3636
@RunWith(MockitoJUnitRunner.class)
37-
public class DataSourceServiceImplTest {
37+
public class DataSourceMetaDataTest {
3838

39-
public static final String CATALOG_SETTING_METADATA_KEY =
39+
public static final String DATASOURCE_SETTING_METADATA_KEY =
4040
"plugins.query.federation.datasources.config";
4141

4242
@Mock
@@ -45,7 +45,7 @@ public class DataSourceServiceImplTest {
4545
@SneakyThrows
4646
@Test
4747
public void testLoadConnectors() {
48-
Settings settings = getCatalogSettings("datasources.json");
48+
Settings settings = getDataSourceSettings("datasources.json");
4949
loadConnectors(settings);
5050
List<DataSourceMetadata> expected =
5151
new ArrayList<>() {
@@ -67,8 +67,8 @@ public void testLoadConnectors() {
6767

6868
@SneakyThrows
6969
@Test
70-
public void testLoadConnectorsWithMultipleCatalogs() {
71-
Settings settings = getCatalogSettings("multiple_datasources.json");
70+
public void testLoadConnectorsWithMultipleDataSources() {
71+
Settings settings = getDataSourceSettings("multiple_datasources.json");
7272
loadConnectors(settings);
7373
List<DataSourceMetadata> expected = new ArrayList<>() {{
7474
add(metadata("prometheus", DataSourceType.PROMETHEUS, ImmutableMap.of(
@@ -89,29 +89,20 @@ public void testLoadConnectorsWithMultipleCatalogs() {
8989
verifyAddDataSourceWithMetadata(expected);
9090
}
9191

92-
@SneakyThrows
93-
@Test
94-
public void testLoadConnectorsWithDuplicateCatalogNames() {
95-
Settings settings = getCatalogSettings("duplicate_datasource_names.json");
96-
loadConnectors(settings);
97-
98-
verify(dataSourceService, never()).addDataSource(any());
99-
}
100-
10192
@SneakyThrows
10293
@Test
10394
public void testLoadConnectorsWithMalformedJson() {
104-
Settings settings = getCatalogSettings("malformed_datasources.json");
95+
Settings settings = getDataSourceSettings("malformed_datasources.json");
10596
loadConnectors(settings);
10697

10798
verify(dataSourceService, never()).addDataSource(any());
10899
}
109100

110-
private Settings getCatalogSettings(String filename) throws URISyntaxException, IOException {
101+
private Settings getDataSourceSettings(String filename) throws URISyntaxException, IOException {
111102
MockSecureSettings mockSecureSettings = new MockSecureSettings();
112103
ClassLoader classLoader = getClass().getClassLoader();
113104
Path filepath = Paths.get(classLoader.getResource(filename).toURI());
114-
mockSecureSettings.setFile(CATALOG_SETTING_METADATA_KEY, Files.readAllBytes(filepath));
105+
mockSecureSettings.setFile(DATASOURCE_SETTING_METADATA_KEY, Files.readAllBytes(filepath));
115106
return Settings.builder().setSecureSettings(mockSecureSettings).build();
116107
}
117108

@@ -120,11 +111,11 @@ void loadConnectors(Settings settings) {
120111
}
121112

122113
void verifyAddDataSourceWithMetadata(List<DataSourceMetadata> metadataList) {
123-
int expectCount = metadataList.size();
124114
ArgumentCaptor<DataSourceMetadata> metadataCaptor =
125115
ArgumentCaptor.forClass(DataSourceMetadata.class);
126-
verify(dataSourceService, times(expectCount)).addDataSource(metadataCaptor.capture());
116+
verify(dataSourceService, times(1)).addDataSource(metadataCaptor.capture());
127117
List<DataSourceMetadata> actualValues = metadataCaptor.getAllValues();
118+
assertEquals(metadataList.size(), actualValues.size());
128119
assertEquals(metadataList, actualValues);
129120
}
130121

plugin/src/test/resources/duplicate_datasource_names.json

Lines changed: 0 additions & 22 deletions
This file was deleted.

0 commit comments

Comments
 (0)