Skip to content

Commit c3bd936

Browse files
vamsimanoharMaxKsyunz
authored andcommitted
Fix NPE with multiple queries containing DOT(.) in index name. (opensearch-project#870)
* Do not remove opensearch from the list of registered catalogs. Signed-off-by: MaxKsyunz <[email protected]> * New Changes to handle bug:opensearch-project#866 Signed-off-by: vamsi-amazon <[email protected]> Signed-off-by: MaxKsyunz <[email protected]> Signed-off-by: vamsi-amazon <[email protected]> Co-authored-by: MaxKsyunz <[email protected]>
1 parent 821fbb0 commit c3bd936

File tree

4 files changed

+39
-8
lines changed

4 files changed

+39
-8
lines changed

integ-test/src/test/java/org/opensearch/sql/sql/IdentifierIT.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ public void testSpecialFieldName() throws IOException {
5757
verifyDataRows(result, rows(10, 30));
5858
}
5959

60+
@Test
61+
public void testMultipleQueriesWithSpecialIndexNames() throws IOException {
62+
createIndexWithOneDoc("test.one", "test.two");
63+
queryAndAssertTheDoc("SELECT * FROM test.one");
64+
queryAndAssertTheDoc("SELECT * FROM test.two");
65+
}
66+
6067
private void createIndexWithOneDoc(String... indexNames) throws IOException {
6168
for (String indexName : indexNames) {
6269
new Index(indexName).addDoc("{\"age\": 30}");

plugin/src/main/java/org/opensearch/sql/plugin/catalog/CatalogServiceImpl.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,18 @@
88
import com.fasterxml.jackson.core.type.TypeReference;
99
import com.fasterxml.jackson.databind.DeserializationFeature;
1010
import com.fasterxml.jackson.databind.ObjectMapper;
11+
import com.google.common.collect.ImmutableSet;
1112
import java.io.IOException;
1213
import java.io.InputStream;
1314
import java.net.URISyntaxException;
1415
import java.security.PrivilegedExceptionAction;
16+
import java.util.Collections;
1517
import java.util.HashMap;
1618
import java.util.HashSet;
1719
import java.util.List;
1820
import java.util.Map;
1921
import java.util.Set;
22+
import java.util.stream.Collectors;
2023
import org.apache.commons.lang3.StringUtils;
2124
import org.apache.logging.log4j.LogManager;
2225
import org.apache.logging.log4j.Logger;
@@ -36,7 +39,7 @@ public class CatalogServiceImpl implements CatalogService {
3639

3740
private static final Logger LOG = LogManager.getLogger();
3841

39-
public static final String OPEN_SEARCH = "opensearch";
42+
public static StorageEngine defaultOpenSearchStorageEngine;
4043

4144
private Map<String, StorageEngine> storageEngineMap = new HashMap<>();
4245

@@ -79,21 +82,22 @@ public void loadConnectors(Settings settings) {
7982
@Override
8083
public StorageEngine getStorageEngine(String catalog) {
8184
if (catalog == null || !storageEngineMap.containsKey(catalog)) {
82-
return storageEngineMap.get(OPEN_SEARCH);
85+
return defaultOpenSearchStorageEngine;
8386
}
8487
return storageEngineMap.get(catalog);
8588
}
8689

8790
@Override
8891
public Set<String> getCatalogs() {
89-
Set<String> catalogs = storageEngineMap.keySet();
90-
catalogs.remove(OPEN_SEARCH);
91-
return catalogs;
92+
return Collections.unmodifiableSet(storageEngineMap.keySet());
9293
}
9394

9495
@Override
9596
public void registerOpenSearchStorageEngine(StorageEngine storageEngine) {
96-
storageEngineMap.put(OPEN_SEARCH, storageEngine);
97+
if (storageEngine == null) {
98+
throw new IllegalArgumentException("Default storage engine can't be null");
99+
}
100+
defaultOpenSearchStorageEngine = storageEngine;
97101
}
98102

99103
private <T> T doPrivileged(PrivilegedExceptionAction<T> action) {
@@ -165,4 +169,4 @@ private void validateCatalogs(List<CatalogMetadata> catalogs) {
165169
}
166170

167171

168-
}
172+
}

plugin/src/test/java/org/opensearch/sql/plugin/catalog/CatalogServiceImplTest.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,21 @@
1515
import lombok.SneakyThrows;
1616
import org.junit.Assert;
1717
import org.junit.Test;
18+
import org.junit.runner.RunWith;
19+
import org.mockito.Mock;
20+
import org.mockito.junit.MockitoJUnitRunner;
1821
import org.opensearch.common.settings.MockSecureSettings;
1922
import org.opensearch.common.settings.Settings;
23+
import org.opensearch.sql.storage.StorageEngine;
2024

21-
25+
@RunWith(MockitoJUnitRunner.class)
2226
public class CatalogServiceImplTest {
2327

2428
public static final String CATALOG_SETTING_METADATA_KEY =
2529
"plugins.query.federation.catalog.config";
2630

31+
@Mock
32+
private StorageEngine storageEngine;
2733

2834
@SneakyThrows
2935
@Test
@@ -73,6 +79,19 @@ public void testLoadConnectorsWithMalformedJson() {
7379
() -> CatalogServiceImpl.getInstance().loadConnectors(settings));
7480
}
7581

82+
@SneakyThrows
83+
@Test
84+
public void testGetStorageEngineAfterGetCatalogs() {
85+
Settings settings = getCatalogSettings("empty_catalog.json");
86+
CatalogServiceImpl.getInstance().registerOpenSearchStorageEngine(storageEngine);
87+
CatalogServiceImpl.getInstance().loadConnectors(settings);
88+
Set<String> expected = new HashSet<>();
89+
Assert.assertEquals(expected, CatalogServiceImpl.getInstance().getCatalogs());
90+
Assert.assertEquals(storageEngine, CatalogServiceImpl.getInstance().getStorageEngine(null));
91+
Assert.assertEquals(expected, CatalogServiceImpl.getInstance().getCatalogs());
92+
Assert.assertEquals(storageEngine, CatalogServiceImpl.getInstance().getStorageEngine(null));
93+
}
94+
7695

7796
private Settings getCatalogSettings(String filename) throws URISyntaxException, IOException {
7897
MockSecureSettings mockSecureSettings = new MockSecureSettings();
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[]

0 commit comments

Comments
 (0)