Skip to content

Commit c13a2b2

Browse files
committed
rest catalog support alter database test
1 parent 4adba63 commit c13a2b2

File tree

6 files changed

+64
-33
lines changed

6 files changed

+64
-33
lines changed

paimon-core/src/main/java/org/apache/paimon/catalog/AbstractCatalog.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ public void alterDatabase(String name, List<PropertyChange> changes, boolean ign
216216
if (changes == null || changes.isEmpty()) {
217217
return;
218218
}
219-
alterDatabaseImpl(name, changes);
219+
this.alterDatabaseImpl(name, changes);
220220
} catch (DatabaseNotExistException e) {
221221
if (ignoreIfNotExists) {
222222
return;

paimon-core/src/main/java/org/apache/paimon/catalog/FileSystemCatalog.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ protected void dropDatabaseImpl(String name) {
9494
}
9595

9696
@Override
97-
protected void alterDatabaseImpl(String name, List<PropertyChange> changes) {
97+
protected void alterDatabaseImpl(String name, List<PropertyChange> changes)
98+
throws DatabaseNotExistException {
9899
throw new UnsupportedOperationException("Alter database is not supported.");
99100
}
100101

paimon-core/src/main/java/org/apache/paimon/rest/RESTCatalog.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -246,9 +246,9 @@ public void alterDatabase(String name, List<PropertyChange> changes, boolean ign
246246
request,
247247
AlterDatabaseResponse.class,
248248
restAuthFunction);
249-
if (response.getUpdated().isEmpty()) {
250-
throw new IllegalStateException("Failed to update properties");
251-
}
249+
// if (response.getUpdated().isEmpty()) {
250+
// throw new IllegalStateException("Failed to update properties");
251+
// }
252252
} catch (NoSuchResourceException e) {
253253
if (!ignoreIfNotExists) {
254254
throw new DatabaseNotExistException(name);

paimon-core/src/test/java/org/apache/paimon/rest/InMemoryMetadataCatalog.java renamed to paimon-core/src/test/java/org/apache/paimon/rest/MetadataInMemoryFileSystemCatalog.java

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,18 @@
5656
import static org.apache.paimon.CoreOptions.PATH;
5757

5858
/** A catalog for testing RESTCatalog. */
59-
public class InMemoryMetadataCatalog extends FileSystemCatalog implements SupportsSnapshots {
59+
public class MetadataInMemoryFileSystemCatalog extends FileSystemCatalog
60+
implements SupportsSnapshots {
6061

6162
public final Map<String, Database> databaseStore;
6263
public final Map<String, TableMetadata> tableMetadataStore;
6364
public final Map<String, List<Partition>> tablePartitionsStore;
6465
public final Map<String, View> viewStore;
6566
public final Map<String, Snapshot> tableSnapshotStore;
6667
public final Map<String, RESTToken> dataTokenStore;
68+
public FileSystemCatalog fileSystemCatalog;
6769

68-
public InMemoryMetadataCatalog(
70+
public MetadataInMemoryFileSystemCatalog(
6971
FileIO fileIO,
7072
Path warehouse,
7173
Options options,
@@ -76,6 +78,7 @@ public InMemoryMetadataCatalog(
7678
Map<String, View> viewStore,
7779
Map<String, RESTToken> dataTokenStore) {
7880
super(fileIO, warehouse, options);
81+
this.fileSystemCatalog = new FileSystemCatalog(fileIO, warehouse, options);
7982
this.databaseStore = databaseStore;
8083
this.tableMetadataStore = tableMetadataStore;
8184
this.tablePartitionsStore = tablePartitionsStore;
@@ -84,7 +87,7 @@ public InMemoryMetadataCatalog(
8487
this.dataTokenStore = dataTokenStore;
8588
}
8689

87-
public static InMemoryMetadataCatalog create(
90+
public static MetadataInMemoryFileSystemCatalog create(
8891
CatalogContext context,
8992
Map<String, Database> databaseStore,
9093
Map<String, TableMetadata> tableMetadataStore,
@@ -104,7 +107,7 @@ public static InMemoryMetadataCatalog create(
104107
throw new UncheckedIOException(e);
105108
}
106109

107-
return new InMemoryMetadataCatalog(
110+
return new MetadataInMemoryFileSystemCatalog(
108111
fileIO,
109112
warehousePath,
110113
context.options(),
@@ -116,12 +119,6 @@ public static InMemoryMetadataCatalog create(
116119
dataTokenStore);
117120
}
118121

119-
// todo: overview
120-
@Override
121-
public FileIO fileIO() {
122-
return fileIO;
123-
}
124-
125122
@Override
126123
public List<String> listDatabases() {
127124
return new ArrayList<>(databaseStore.keySet());
@@ -147,22 +144,26 @@ protected void dropDatabaseImpl(String name) {
147144
databaseStore.remove(name);
148145
}
149146

150-
@Override
151-
protected void alterDatabaseImpl(String name, List<PropertyChange> changes) {
152-
Pair<Map<String, String>, Set<String>> setPropertiesToRemoveKeys =
153-
PropertyChange.getSetPropertiesToRemoveKeys(changes);
154-
Map<String, String> setProperties = setPropertiesToRemoveKeys.getLeft();
155-
Set<String> removeKeys = setPropertiesToRemoveKeys.getRight();
156-
Database database = databaseStore.get(name);
157-
Map<String, String> parameter = database.options();
158-
if (!setProperties.isEmpty()) {
159-
parameter.putAll(setProperties);
160-
}
161-
if (!removeKeys.isEmpty()) {
162-
parameter.keySet().removeAll(removeKeys);
147+
protected void alterDatabaseImpl(String name, List<PropertyChange> changes)
148+
throws DatabaseNotExistException {
149+
if (databaseStore.containsKey(name)) {
150+
Pair<Map<String, String>, Set<String>> setPropertiesToRemoveKeys =
151+
PropertyChange.getSetPropertiesToRemoveKeys(changes);
152+
Map<String, String> setProperties = setPropertiesToRemoveKeys.getLeft();
153+
Set<String> removeKeys = setPropertiesToRemoveKeys.getRight();
154+
Database database = databaseStore.get(name);
155+
Map<String, String> parameter = new HashMap<>(database.options());
156+
if (!setProperties.isEmpty()) {
157+
parameter.putAll(setProperties);
158+
}
159+
if (!removeKeys.isEmpty()) {
160+
parameter.keySet().removeAll(removeKeys);
161+
}
162+
Database alterDatabase = Database.of(name, parameter, null);
163+
databaseStore.put(name, alterDatabase);
164+
} else {
165+
throw new DatabaseNotExistException(name);
163166
}
164-
Database alterDatabase = Database.of(name, parameter, null);
165-
databaseStore.put(name, alterDatabase);
166167
}
167168

168169
@Override

paimon-core/src/test/java/org/apache/paimon/rest/RESTCatalogServer.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@
2424
import org.apache.paimon.catalog.CatalogContext;
2525
import org.apache.paimon.catalog.Database;
2626
import org.apache.paimon.catalog.Identifier;
27+
import org.apache.paimon.catalog.PropertyChange;
2728
import org.apache.paimon.catalog.RenamingSnapshotCommit;
2829
import org.apache.paimon.catalog.TableMetadata;
2930
import org.apache.paimon.operation.Lock;
3031
import org.apache.paimon.options.CatalogOptions;
3132
import org.apache.paimon.options.Options;
3233
import org.apache.paimon.partition.Partition;
3334
import org.apache.paimon.rest.auth.BearTokenAuthProvider;
35+
import org.apache.paimon.rest.requests.AlterDatabaseRequest;
3436
import org.apache.paimon.rest.requests.AlterPartitionsRequest;
3537
import org.apache.paimon.rest.requests.AlterTableRequest;
3638
import org.apache.paimon.rest.requests.CommitTableRequest;
@@ -41,6 +43,7 @@
4143
import org.apache.paimon.rest.requests.DropPartitionsRequest;
4244
import org.apache.paimon.rest.requests.MarkDonePartitionsRequest;
4345
import org.apache.paimon.rest.requests.RenameTableRequest;
46+
import org.apache.paimon.rest.responses.AlterDatabaseResponse;
4447
import org.apache.paimon.rest.responses.CommitTableResponse;
4548
import org.apache.paimon.rest.responses.CreateDatabaseResponse;
4649
import org.apache.paimon.rest.responses.ErrorResponse;
@@ -71,12 +74,14 @@
7174
import okhttp3.mockwebserver.RecordedRequest;
7275

7376
import java.io.IOException;
77+
import java.util.ArrayList;
7478
import java.util.Collections;
7579
import java.util.HashMap;
7680
import java.util.List;
7781
import java.util.Map;
7882
import java.util.Optional;
7983
import java.util.UUID;
84+
import java.util.stream.Collectors;
8085

8186
import static org.apache.paimon.rest.RESTObjectMapper.OBJECT_MAPPER;
8287

@@ -86,7 +91,7 @@ public class RESTCatalogServer {
8691
private static final String PREFIX = "paimon";
8792
private static final String DATABASE_URI = String.format("/v1/%s/databases", PREFIX);
8893

89-
private final InMemoryMetadataCatalog catalog;
94+
private final MetadataInMemoryFileSystemCatalog catalog;
9095
private final Dispatcher dispatcher;
9196
private final MockWebServer server;
9297
private final String authToken;
@@ -103,7 +108,7 @@ public RESTCatalogServer(String warehouse, String initToken) {
103108
Options conf = new Options();
104109
conf.setString("warehouse", warehouse);
105110
this.catalog =
106-
InMemoryMetadataCatalog.create(
111+
MetadataInMemoryFileSystemCatalog.create(
107112
CatalogContext.create(conf),
108113
databaseStore,
109114
tableMetadataStore,
@@ -138,7 +143,7 @@ public void setDataToken(Identifier identifier, RESTToken token) {
138143
}
139144

140145
public static Dispatcher initDispatcher(
141-
InMemoryMetadataCatalog catalog, String warehouse, String authToken) {
146+
MetadataInMemoryFileSystemCatalog catalog, String warehouse, String authToken) {
142147
return new Dispatcher() {
143148
@Override
144149
public MockResponse dispatch(RecordedRequest request) {
@@ -477,6 +482,25 @@ private static MockResponse databaseApiHandler(
477482
case "DELETE":
478483
catalog.dropDatabase(databaseName, false, true);
479484
return new MockResponse().setResponseCode(200);
485+
case "POST":
486+
AlterDatabaseRequest requestBody =
487+
OBJECT_MAPPER.readValue(
488+
request.getBody().readUtf8(), AlterDatabaseRequest.class);
489+
List<PropertyChange> changes = new ArrayList<>();
490+
for (String property : requestBody.getRemovals()) {
491+
changes.add(PropertyChange.removeProperty(property));
492+
}
493+
for (Map.Entry<String, String> entry : requestBody.getUpdates().entrySet()) {
494+
changes.add(PropertyChange.setProperty(entry.getKey(), entry.getValue()));
495+
}
496+
catalog.alterDatabase(databaseName, changes, false);
497+
AlterDatabaseResponse alterDatabaseResponse =
498+
new AlterDatabaseResponse(
499+
requestBody.getRemovals(),
500+
requestBody.getUpdates().keySet().stream()
501+
.collect(Collectors.toList()),
502+
Collections.emptyList());
503+
return mockResponse(alterDatabaseResponse, 200);
480504
default:
481505
return new MockResponse().setResponseCode(404);
482506
}

paimon-core/src/test/java/org/apache/paimon/rest/RESTCatalogTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,11 @@ protected boolean supportsView() {
187187
return true;
188188
}
189189

190+
@Override
191+
protected boolean supportsAlterDatabase() {
192+
return true;
193+
}
194+
190195
private void createTable(
191196
Identifier identifier, Map<String, String> options, List<String> partitionKeys)
192197
throws Exception {

0 commit comments

Comments
 (0)